Ruby: アンパサンドとコロン`&:`記法について調べてみた

: Rubyのシンボルには任意の文字列を使えます(引用符を使えば:"記号含み&*(の文字列"も使えます)が、本記事では簡単のため&との組み合わせでは:メソッド名と限定して表記します。

参考: class Symbol (Ruby 2.6.0)

&:メソッド名とは

Rubyの&:メソッド名という記法についてググって調べようとするとなかなか大変だったのでメモします。というのも、この記法そのものには定まった名称がないからです。

&
手続きオブジェクト(Procオブジェクト)をブロックに変換するショートハンド
「Proc coercion」演算子と呼ばれることも
:メソッド名
Rubyのシンボル

参考: メソッド呼び出し(super・ブロック付き・yield) (Ruby 2.6.0)

ブロックの部分だけを先に定義して変数に保存しておき、後からブロック付きメソッドに渡すことも出来ます。それを実現するのが手続きオブジェクト(Proc)です。それをブロックとして渡すにはブロック付きメソッドの最後の引数として&で修飾した手続きオブジェクトを渡します
docs.ruby-lang.orgより

&:メソッド名は上記の通り2つの記法の合わせ技なので、定まった名称がない理由も理解できました。

見た目にはあたかも&:メソッド名のようではありますが、実は&:メソッド名の組み合わせなので、一度わかってしまえばいいのですが少々紛らわしいです。

とはいうものの、ぼっち演算子のような「いい名前」が&:メソッド名にもあればと思います。誰か付けませんか?

&によるProc coercion

以下の記事によると、&によるProc変換は「Proc coercion」(coercion: 強制、強要など)と呼ばれているとのことです。ググった限りでは用語にまではなっていないような雰囲気ですが。

&によるProc coercionはRubyの最初期からある機能なので、後から導入されたぼっち演算子&.とは異なり、Rubyでは昔から使える記法ということになります。

参考

おたより発掘

関連記事

Ruby: `&:メソッド名`はブロック変数渡しより若干高速

Rubyのぼっち演算子はRailsの`Object#try`より高速(翻訳)

デザインも頼めるシステム開発会社をお探しならBPS株式会社までどうぞ 開発エンジニア積極採用中です! Ruby on Rails の開発なら実績豊富なBPS

この記事の著者

hachi8833

Twitter: @hachi8833、GitHub: @hachi8833 コボラー、ITコンサル、ローカライズ業界、Rails開発を経てTechRachoの編集・記事作成を担当。 これまでにRuby on Rails チュートリアル第2版の監修および半分程度を翻訳、Railsガイドの初期翻訳ではほぼすべてを翻訳。その後も折に触れて更新翻訳中。 かと思うと、正規表現の粋を尽くした日本語エラーチェックサービス enno.jpを運営。 実は最近Go言語が好きで、Goで書かれたRubyライクなGoby言語のメンテナーでもある。 仕事に関係ないすっとこブログ「あけてくれ」は2000年頃から多少の中断をはさんで継続、現在はnote.muに移転。

hachi8833の書いた記事

夏のTechRachoフェア2019

週刊Railsウォッチ

インフラ

ActiveSupport探訪シリーズ