私は次のような地図の省略形を知っています:
[1, 2, 3, 4].map(&:to_s)
> ["1", "2", "3", "4"]
これは次の略記だと言われました:
[1, 2, 3, 4].map{|i| i.to_s}
これは完全に理にかなっています。私の質問はこれです:もっと簡単な書き方があるはずです:
[1, 2, 3, 4].map{|x| f.call(x)}
いくつかの手順についてf。入力した方法が最初からそれほど長くないことは知っていますが、どちらも省略形が存在する前の例ではないと主張します。この例は、最初の例を補完するように見えます。すべてのiに対してiのto_sメソッドを呼び出すのではなく、すべてのxに対してfを呼び出したいと思います。
そのような速記は存在しますか?
残念ながら、この省略表記( "Symbol#to_proc"を呼び出す)には、呼び出されるメソッドまたはブロックに引数を渡す方法がないため、次のことを行うことさえできませんでした。
array_of_strings.map(&:include, 'l') #=> this would fail
しかし、運が良ければ実際にはこのショートカットは必要ありませんあなたがやろうとしていることをすることができます。アンパサンドは、ProcまたはLambdaをブロックに変換でき、その逆も可能です。
my_routine = Proc.new { |str| str.upcase }
%w{ one two three }.map &my_routine #=> ['ONE', 'TWO', 'THREE']
my_routine
の前にコロンがないことに注意してください。これは、メソッドを見つけて:my_routine
を呼び出すことにより、.method
シンボルをprocに変換するのではなく、my_routine
Procをブロックに変換してそれをmap
に渡します。
これを知っていると、ネイティブRubyメソッドをマップすることもできます:
%w{ one two three }.map &method(:p)
method
メソッドはp
メソッドを取得してProcに変換し、&
はそれをmap
に渡されるブロックに変換します。その結果、各アイテムが印刷されます。これはこれと同等です:
%w{ one two three }.map { |s| p s }