web-dev-qa-db-ja.com

その他Ruby Map Shorthand Notation

私は次のような地図の省略形を知っています:

[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を呼び出したいと思います。

そのような速記は存在しますか?

24
trh178

残念ながら、この省略表記( "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_routineProcをブロックに変換してそれをmapに渡します。

これを知っていると、ネイティブRubyメソッドをマップすることもできます:

%w{ one two three }.map &method(:p)

methodメソッドはpメソッドを取得してProcに変換し、&はそれをmapに渡されるブロックに変換します。その結果、各アイテムが印刷されます。これはこれと同等です:

%w{ one two three }.map { |s| p s }
48
coreyward