La rubena map-a simbola lertaĵo
En Rubeno oni povas uzi la sekvan:
aro.map(&:metodo)
Sed kion tio signifas. Se vi ne scias pri map
ĝi estas membro de la Enumerable
enmiksaĵo, baze oni alvokas map
je aro kaj ĝi plenumos la block
je ĉiu elemento de la aro kaj liveras la resultojn.
['unu', 'du', 'tri'].map do |ĉeno|
ĉeno.upcase
end
# => ["UNU", "DU", "TRI"]
# aŭ
['unu', 'du', 'tri'].map(&:upcase)
# => ["UNU", "DU", "TRI"]
map
ricevas bloko
sed &:metodo
ne estas bloko. Kio okazas?
Kiam la rubena sistemo legas &
ĝi tradukas ĝin al .to_proc
sur la objekto.
class Provo
def to_proc
puts "saluton"
Proc.new {}
end
end
[].map(&Provo.new)
# => saluton
Reen al la &:metodo
lertaĵo, ĝi unue aldoniĝis Rails, sed tiam la rubena skipo ŝatis ĝin sufiĉe por aldoni ĝin en Rubenon. La lertaĵo estas ke ili realigis to_proc
je la simbolo. Ni povas krei nian propran.
class MiaSimbolo
def initialize(metodnomo)
@metodnomo = metodnomo
end
def to_proc
Proc.new do |ero|
ero.send(@metodnomo)
end
end
end
['unu', 'du', 'tri'].map(&MiaSimbolo.new("upcase"))
# => ["UNU", "DU", "TRI"]
Bedaŭrinde, la nova
sintakso ne estas tiel eleganta kiel la simbola sintakso. Supren estas kiel la lertaĵo funkcias suben. Kie ajn vi povas alvoki objekto.send(:medotnomo)
vi povas alvoki aro.map(&:modotnomo)
je aro de tiaj objektoj.