LoginSignup
0
0

More than 5 years have passed since last update.

繰り返し処理で書かれてたりする'&'に関する自分用メモ

Last updated at Posted at 2018-12-17

前置き

使っておきながら&って何?って思ってたので軽く調べて考えた。
軽〜く調べて軽〜く考えただけなので違うかも。
追い追い修正していくつもりはある。

本題

(&: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とは...」みたいなところがあるかもしれないけど
簡単に言えばブロックをオブジェクトとして作成しておけるものみたいな感じよきっと。
事前にブロックをオブジェクトとして用意しておけば、
今回のようにブロックとして使用する際に使いまわせて再利用性が高まるぜ!ってことよね。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0