以下との混同Array#each
:
%w{ david black }.each {|str| str.capitalize }
#=> ["david", "black"]
上記のコードはクールですが、以下のロジックがどのように機能するのか理解できませんでした。
%w{ david black }.each(&:capitalize)
#=> ["david", "black"]
以下との混同Array#each
:
%w{ david black }.each {|str| str.capitalize }
#=> ["david", "black"]
上記のコードはクールですが、以下のロジックがどのように機能するのか理解できませんでした。
%w{ david black }.each(&:capitalize)
#=> ["david", "black"]
と呼ばれる非常に古いトリックSymbol#to_proc
です。
ここで詳細を読むことができます: http://pragdave.pragprog.com/pragdave/2005/11/symbolto_proc.html
基本的には、引数を取らないメソッドを呼び出すためのショートカットです。などでよく使われmap
ます。
%w[i can measure length of strings].map(&:length) # => [1, 3, 7, 6, 2, 7]
の表記法&:something
は、配列のすべての要素に対してメソッドを実行しsomething
ます。
これは通常、配列のすべてのエントリを変更したり、ハッシュからデータを抽出したりするために map と共に使用されます。
[{:foo => :bar, :meh => :bar2}, {:foo => :one, :meh => :two}].map(&:foo)
=> [:bar, :one]
地図の使い方は?
[1173]pry(main)> ["david","black"].map{|str| str.capitalize }
=> ["David","Black"]
[1173]pry(main)>
私はあなたの例を.eachで得ていません.多分あなたは.mapを意味していました
&:method_name を渡すと、ブロック内で実行するための省略形になります。したがって、各アイテムにこのメソッドを適用します。