Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
&:メソッド名 / Method / method()
『&:メソッド名』はシンボルをProcに変換する省略記法です。『method()』はメソッドをオブジェクトとして取得します。
構文
# &:メソッド名 でブロックを省略します。
コレクション.map(&:メソッド名)
# 以下と同等の処理です。
コレクション.map { |要素| 要素.メソッド名 }
# method() でメソッドオブジェクトを取得します。
メソッドオブジェクト = オブジェクト.method(:メソッド名)
# メソッドオブジェクトを & で Proc に変換して渡します。
コレクション.map(&メソッドオブジェクト)
メソッド一覧
| 構文・メソッド | 概要 |
|---|---|
| &:シンボル | シンボルの『to_proc』を呼び出し、Procに変換してブロックとして渡します。 |
| method(:名前) | レシーバのメソッドをMethodオブジェクトとして返します。 |
| to_proc | SymbolやMethodをProcオブジェクトに変換します。 |
| respond_to? | オブジェクトが指定したメソッドを持つかどうかを確認します。 |
サンプルコード
# &:メソッド名 でブロックを省略して書きます。
単語 = ["hello", "world", "ruby"]
大文字 = 単語.map(&:upcase)
puts 大文字.inspect # ["HELLO", "WORLD", "RUBY"]
# 整数変換にも使えます。
文字列数値 = ["1", "2", "3", "4"]
整数 = 文字列数値.map(&:to_i)
puts 整数.inspect # [1, 2, 3, 4]
# nil を除外する実用例です。
混在 = ["apple", nil, "banana", nil, "cherry"]
フルーツのみ = 混在.select(&:itself)
puts フルーツのみ.inspect # ["apple", "banana", "cherry"]
# method() でメソッドをオブジェクトとして取り出します。
def 変換(テキスト)
テキスト.upcase + "!"
end
変換メソッド = method(:変換)
puts 変換メソッド.call("hello") # HELLO!
# method() を & でブロックとして渡します。
単語 = ["hello", "world"]
puts 単語.map(&method(:変換)).inspect # ["HELLO!", "WORLD!"]
概要
『&:メソッド名』はRubyで最もよく使われる省略記法のひとつです。内部では『Symbol#to_proc』が呼ばれ、ブロック『{ |x| x.メソッド名 }』と同等のProcが生成されます。
『method(:名前)』を使うとメソッドをファーストクラスオブジェクトとして扱えるため、コールバックや関数合成に活用できます。引数を受け取るメソッドは『&:メソッド名』の形では引数を渡せないため、引数が必要な場合は通常のブロック記法を使ってください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。