Xəritə (və: ad) Ruby-də nə deməkdir?

RailsCast'da bu kodu tapdum :

 def tag_names @tag_names || tags.map( ') end 

map(> nədir map(> deməkdir?

456
01 авг. collimarco tərəfindən təyin 01 aug. 2009-08-01 20:35 '09 at 20:35 'da 2009-08-01 20:35
@ 14 cavab

tags.map( ') üçün bu kısaltma tags.map( ')

foo bir to_proc metodu olan bir to_proc , foo.to_proc və bir metod bloku kimi istifadə edən > kimi bir üsula keçə bilərsiniz.

Symbol#to_proc ilk olaraq ActiveSupport tərəfindən əlavə edildi, lakin Ruby 1.8.7-də birləşdirildi. Bu onun həyata keçirilməsidir:

 class Symbol def to_proc Proc.new do |obj, *args| obj.send self, *args end end end 
478
01 авг. cavab cümə axşamı 01 avqustda verilir. 2009-08-01 20:50 '09 da 20:50 'da 2009-08-01 20:50

Çoxları bilməyən başqa bir böyük qısa

 array.each(> 

üçün qısa olan

 array.each { |element| foo(element) } 

Çağırış method(:foo) , metodunun foo əks etdirən və özünün " to_proc " ə to_proc metoduna malik olduğunu göstərmək üçün self bir Method obyektini to_proc .

border=0

Bu üslubunu etmək istədiyin zaman çox faydalıdır. Məsələn, "foo" simvoluna bərabər olan dizidəki hər hansı bir simli olub olmadığını yoxlamaqdır. Normal bir yol var:

 ["bar", "baz", "foo"].any? { |str| str == "foo" } 

Və bir yol var:

 ["bar", "baz", "foo"].any?(> 

Tercih edilən metodun ən oxunmalı olması lazımdır.

161
08 марта '12 в 21:07 2012-03-08 21:07 Cavab 08 mart 2012-ci il saat 21: 00-da Gerry tərəfindən verilir. 2012-03-08 21:07

Bu, ekvivalentdir

 def tag_names @tag_names || tags.map { |tag| tag.name }.join(' ') end 
71
01 авг. Cavab Sophie Alpert tərəfindən verilir 01 av. 2009-08-01 20:39 '09 da 20:39 'da 2009-08-01 20:39

Biz də göstəririk ki, amfon sümüyü #to_proc yalnız simvolu ilə deyil, hər hansı bir siniflə #to_proc bilər. Bir çox rezinanlar Array sinifində # #to_proc seçməyi üstün tuturlar:

 class Array def to_proc proc { |receiver| receiver.send *self } end end # And then... [ 'Hello', 'Goodbye' ].map  :+, ' world!' ] #=> ["Hello world!", "Goodbye world!"] 

Ampersand > yuxarıdakı to_proc bir Array sinfi olan to_proc mesaj göndərərək işləyir. Və bir #to_proc üsulunu təyin etdiyim üçün simli belə görünür:

 [ 'Hello', 'Goodbye' ].map { |receiver| receiver.send( :+, ' world!' ) } 
39
20 нояб. Cavab Boris Stitnicky 20 noyabrda verilir . 2012-11-20 15:38 '12 at 3:38 PM 2012-11-20 15:38

Bu, tags.map { |tag| tag.name }.join(' ') tags.map { |tag| tag.name }.join(' ')

35
01 авг. cavab Oliver N. 01 avqustda verilir. 2009-08-01 20:37 '09 da 20:37 'da 2009-08-01 20:37
 tags.map(> 

Eyni şəkildə

 tags.map{|tag| tag.name} 

> sadəcə olaraq çağırılacaq metodun adı kimi xarakterdən istifadə edir.

27
01 нояб. Cavab Albert.Qing verilir 01 Noyabr. 2016-11-01 06:23 '16 saat 06:23 'da 2016-11-01 06:23

Josh Lee'nin cavabı, Ruby kodunun aşağıdakı kimi olması istisna olmaqla, demək olar ki, düzgündür.

 class Symbol def to_proc Proc.new do |receiver| receiver.send self end end end 

yox

 class Symbol def to_proc Proc.new do |obj, *args| obj.send self, *args end end end 

Bu print [[1,'a'],[2,'b'],[3,'c']].map(> düyməsinə basdığınızda, print [[1,'a'],[2,'b'],[3,'c']].map(> yerinə yetirilir, Ruby ilk giriş [1,'a'] 1' və 'a' obj 1 və args* 'a' vermək üçün bir səhv səbəb olur, çünki Fixnum 1 obyektinin bir öz metodu yoxdur (ilk olan).


[[1,'a'],[2,'b'],[3,'c']].map(> icra edildikdə [[1,'a'],[2,'b'],[3,'c']].map(> ;

  • :first , bir Symbol obyektidir, belə ki: > parametr kimi xəritə metoduna təyin edildikdə, # to_proc xarakteri çağırılır.

  • Xəritə, ilk.to_proc ilə [1,'a'] parametri ilə zəng etmək üçün bir mesaj göndərir, məsələn :first.to_proc.call([1,'a']) .

    Prosedur
  • Symbol sinifində olan to_proc, göndərilən mesajı (: birinci) parametri ilə bir sıra obyektinə ( [1,'a'] ) göndərir, məsələn, [1,'a'].send(:first) .

  • [[1,'a'],[2,'b'],[3,'c']] obyektlərində qalan elementləri təkrarlayır.

Bu ifadənin [[1,'a'],[2,'b'],[3,'c']].map(|e| e.first) . [[1,'a'],[2,'b'],[3,'c']].map(|e| e.first) .

14
24 янв. Cavab 24 yanvar prosseek verilir 2014-01-24 00:08 '14 at 0:08 2014-01-24 00:08

Burada iki şey baş verir və hər ikisini də başa düşmək vacibdir.

Digər cavablarda təsvir olunduğu kimi, Symbol#to_proc metodu Symbol#to_proc .

Lakin to_proc səbəbi bir simvolda çağırılır, çünki bloka bir argument olaraq to_proc keçir. Bir üsul çağırışında bir arqument yerləşdirilməsi > qarşısında bu yolu keçirməyə səbəb olur. Bu hər hansı bir Ruby metodu üçün deyil, simvolları olan bir map deyil.

 def some_method(*args,  puts "args: #{args.inspect}" puts "block: #{block.inspect}" end some_method(:whatever) # args: [:whatever] # block: nil some_method( # args: [] # block: #<Proc:0x007fd23d010da8> some_method( # TypeError: wrong argument type String (expected Proc) # (String doesn't respond to #to_proc) 

Symbol bir blok olaraq ötürüldüyü üçün Proc çevrilir. Biz bunu bir ampersand olmadan proc üçün .map köçürmək cəhd göstərərək göstərə bilər:

 arr = %w(apple banana) reverse_upcase = proc { |i| i.reverse.upcase } reverse_upcase.is_a?(Proc) => true arr.map(reverse_upcase) # ArgumentError: wrong number of arguments (1 for 0) # (map expects 0 positional arguments and one block argument) arr.map( => ["ELPPA", "ANANAB"] 

Konvertasiya edilməsinə ehtiyac yoxdur, baxmayaraq ki, metod onu necə istifadə etməyəcəkdir, çünki blok dayandırmasını gözləyir. .map gözlənilən bloku verir > verir.

8
09 апр. Cavab devpuppy verilir 09 apr. 2016-04-09 04:43 '16 'da 4:43' də 2016-04-09 04:43

( ad) ( name.to_proc) üçün tags.map{ |t| t.name }.join(' ') tags.map{ |t| t.name }.join(' ')

to_proc həqiqətən C həyata keçirilir

5
25 авг. cavab tessie 25 aug tərəfindən verilir . 2016-08-25 08:50 '16 'da 8:50 2016-08-25 08:50' də

Zaten mükemmel cavablara sahib olmasına baxmayaraq, yeniyetmənin perspektivinə baxaraq əlavə məlumat əlavə etmək istərdim:

Xəritə (və: ad) Ruby-də nə deməkdir?

Bu, bir ekran funksiyasına bir parametr kimi başqa üsuldan keçmək deməkdir. (Əslində, bir tövsiyəyə çevrilən bir xarakter verərsiniz, amma bu, bu halda vacib deyildir).

Əhəmiyyətli olan, ənənəvi block tərzi yerinə xarital metodunun argumenti kimi istifadə ediləcək name olan bir method .

2
08 дек. Cavab Jonathan Duarte tərəfindən verilir 08 dekabr. 2017-12-08 18:23 '17 də saat 18:23 'də 2017-12-08 18:23

bu deməkdir

 array.each(> 
1
20 дек. Cavab mminski 20 dekabr verilir . 2016-12-20 15:25 '16 saat 15:25 'də 2016-12-20 15:25

Burada :name , tag obyektinin name üsuluna işarə edən bir xarakter daşıyır. Biz keçdiyimizdə > map yazdığımızda, name bir proc obyekti kimi qiymətləndirir. Bir sözlə, tags.map(> kimi davranır:

 tags.map do |tag| tag.name end 
1
30 июня '16 в 9:30 2016-06-30 09:30 İyun ayının 30-da saat 16 : 30-da cümə axşamı saat 09: 30-da cavab verilir

Xəritədə ( ad) sayılan bir obyekt (vəziyyətinizdə olan etiketlər ) götürülür və hər bir element / tag üçün ad üsulunu işləyir, bu üsuldan hər bir qaytarma dəyəri göstərilir.

Bunun üçün qısa

 array.map { |element| element.name } 

element adları bir sıra qaytarır (tags)

0
01 сент. Cavab Sunda 01 Sentyabr verilir. 2018-09-01 07:48 '18 at 7:48 2018-09-01 07:48

Aşağıdakı kimi eyni:

 def tag_names if @tag_names @tag_names else tags.map{ |t| t.name }.join(' ') end 
0
27 июня '16 в 12:32 2016-06-27 12:32 Cavab istifadəçi tərəfindən verilir 3078630 27 iyun '12 saat 12:32 2016-06-27 12:32