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.