前置き
使っておきながら&
って何?って思ってたので軽く調べて考えた。
軽〜く調べて軽〜く考えただけなので違うかも。
追い追い修正していくつもりはある。
本題
(&:method)
nums = [1, 2, 3]
nums.map(&:to_s)
#=> ["1", "2", "3"]
こっちは割とすぐに(使い方だけ)覚えた。
nums.map { |n| n.to_s }
#=> ["1", "2", "3"]
と同じ。
毎回メソッドを1つ実行する処理を短く書ける。
nums.map(&:to_s)
の引数部分はString型になってる訳ではないので注意。
&:to_s
は実際には&:to_s.to_proc
が期待されるから
:to_s
に対応するprocオブジェクトをブロックとして使いますよ!
みたいなことが書かれている...のかな。
だからnums.map(&:to_s.to_i)
なんてやってもエラーになるよ。
(&proc)
words = [World, Japan, Ruby]
hello = proc { |x| "Hello #{x}!" }
words.map(&hello)
#=> ["Hello World!", "Hello Japan!", "Hello Ruby!"]
引数部分を()含め丸ごとブロックと入れ替えたのと同じって感じ。
words.map { |x| "Hello #{x}!" }
#=> ["Hello World!", "Hello Japan!", "Hello Ruby!"]
いまいちよくわかってなくてあまり使ってなかったけど、ちゃんと理解すれば簡単(?)
やってること自体は&:method
と同じでしかも基本形はこっち。
これはこれと一緒みたいなのがあるとやっぱりわかりやすい気がする。
まとめ
正直完全な理解はできてないかも。言語化も難しい。
なんとなく&
をprocオブジェクトの前に付けることで、
procオブジェクトをブロックとして使っているといったところだろうか。
&proc
は見たまんまそうだし、&:method
も実行時は
&:method.to_proc
が期待されるとかでブロックを渡していることになるな。
こんな記事読んでヘェ〜ってなる人は「そもそもprocとは...」みたいなところがあるかもしれないけど
簡単に言えばブロックをオブジェクトとして作成しておけるものみたいな感じよきっと。
事前にブロックをオブジェクトとして用意しておけば、
今回のようにブロックとして使用する際に使いまわせて再利用性が高まるぜ!ってことよね。