読者です 読者をやめる 読者になる 読者になる

map(:&value)について理解する

Ruby

Rubyの本読んでたら以下のような書き方を見つけた

threads.map(&:value)

この&:valueの部分が何してるのかわからなかったので,ググりながら自分なりに考えてみた.

まず:valueはシンボルである.

次にmapメソッドの引数は:valueの前に「&」が付いている.mapはブロックを受け取るメソッドである.それにブロックとしてProcオブジェクトを渡す場合はメソッドの引数とするProcオブジェクトの変数名の前に「&」を付けてメソッドを呼び出す.

しかし今回mapメソッドに渡したものはProcオブジェクトではなくシンボルである.そのため「Symbol型をProc型に変換」が行われ結果として以下のようなProcオブジェクトがmapメソッドに渡される

Proc.new {|elem| elem.value}

&:を使わないで書こうとすると以下のようになる

threads.map {|elem|
  elem.value
}

結論

ブロックを受け取るメソッド&:を使うことで,直接ブロックを記述するよりも短く書くことができる.

あと「Symbol型をProc型に変換」と書いたけれども,具体的にどんな変換を行っているのか分かっていない.リファレンス調べてみたけどその部分について説明しているところを見つけることができなかったのでRubyのコードの中身を直接見て挙動を確認したほうがよさそう.

参考図書,URL

パーフェクトRuby (PERFECT SERIES 6)

パーフェクトRuby (PERFECT SERIES 6)

RubyのSymbol#to_procを考えた人になってみる