&:メソッド名 / Method / method()
| 対応: | Ruby 1.9(2007) |
|---|
『&:メソッド名』はシンボルをProcに変換する省略記法です。『method()』はメソッドをオブジェクトとして取得します。
構文
# &:メソッド名 でブロックを省略します。
コレクション.map(&:メソッド名)
# 以下と同等の処理です。
コレクション.map { |要素| 要素.メソッド名 }
# method() でメソッドオブジェクトを取得します。
メソッドオブジェクト = オブジェクト.method(:メソッド名)
# メソッドオブジェクトを & で Proc に変換して渡します。
コレクション.map(&メソッドオブジェクト)
メソッド一覧
| 構文・メソッド | 概要 |
|---|---|
| &:シンボル | シンボルの『to_proc』を呼び出し、Procに変換してブロックとして渡します。 |
| method(:名前) | レシーバのメソッドをMethodオブジェクトとして返します。 |
| to_proc | SymbolやMethodをProcオブジェクトに変換します。 |
| respond_to? | オブジェクトが指定したメソッドを持つかどうかを確認します。 |
サンプルコード
sample_symbol_to_proc_method.rb
# &:メソッド名 でブロックを省略して書きます。
words = ["hello", "world", "ruby"]
upcased = words.map(&:upcase)
puts upcased.inspect # ["HELLO", "WORLD", "RUBY"]
# 整数変換にも使えます。
str_numbers = ["1", "2", "3", "4"]
integers = str_numbers.map(&:to_i)
puts integers.inspect # [1, 2, 3, 4]
# nil を除外する実用例です。
# 『itself』はオブジェクト自身を返すメソッドです。
mixed = ["桐生一馬", nil, "真島吾朗", nil, "秋山駿"]
members_only = mixed.select(&:itself)
puts members_only.inspect # ["桐生一馬", "真島吾朗", "秋山駿"]
# method() でメソッドをオブジェクトとして取り出します。
def transform(text)
text.upcase + "!"
end
transform_method = method(:transform)
puts transform_method.call("hello") # HELLO!
# method() を & でブロックとして渡します。
words = ["hello", "world"]
puts words.map(&method(:transform)).inspect # ["HELLO!", "WORLD!"]
ruby symbol_to_proc_method.rb ["HELLO", "WORLD", "RUBY"] [1, 2, 3, 4] ["桐生一馬", "真島吾朗", "秋山駿"] HELLO! ["HELLO!", "WORLD!"]
概要
『&:メソッド名』はRubyで最もよく使われる省略記法のひとつです。内部では『Symbol#to_proc』が呼ばれ、ブロック『{ |x| x.メソッド名 }』と同等のProcが生成されます。
『method(:名前)』を使うとメソッドをファーストクラスオブジェクトとして扱えるため、コールバックや関数合成に活用できます。引数を受け取るメソッドは『&:メソッド名』の形では引数を渡せないため、引数が必要な場合は通常のブロック記法を使ってください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。