a = (1..10).to_a
a.map(&:even?)
=> [false, true, false, true, false, true, false, true, false, true]
メソッド名を保持する文字列を使用してマップを呼び出す方法は?
foo = 'even?'
a.map(...foo...)
a = (1..10).to_a
a.map(&:even?)
=> [false, true, false, true, false, true, false, true, false, true]
メソッド名を保持する文字列を使用してマップを呼び出す方法は?
foo = 'even?'
a.map(...foo...)
foo = 'even?'
[1,2,3,4,5].map(&foo.to_sym)
=> [false, true, false, true, false]
短縮構文はアンパサンドコロンではなく、アンパサンドの後に記号が続きます。
(1..10).map(& :even?)
Ruby のメソッドは通常、シンボルによって参照されるため、変数にシンボルがある場合、この構文は期待どおりに機能します。
name = :even?
(1..10).map(&name)
変数メソッド名を制御できない場合、たとえば引数の場合は、send
代わりに一般的なメソッドを使用することをお勧めします。シンボルと文字列の両方で機能します。
def perform enum, name
enum.each{ |e| e.send(name) }
end
perform 1..10, "even?"
別の方法として、「完全な形式」のブロックを使用し、より一般的です。
a = (1..10).to_a
name = 'even?'
a.map{|b| b.send name} # => [false, true, false, true, false, true, false, true, false, true]