`&method(:function)`はどういう意味ですか?


15

どういう&method(:function)意味ですか?たとえば、次の行があります。

res = integrate(0, 1, a, &method(:function))

(これまでのところ)2つの優れた答え。あなたはラッキーです!
Cary Swoveland

回答:


13

メソッドがあるとしましょう

def add_one(num)
  num + 1
end

そして文字列の配列

arr = ["1", "2"]

mapからの対応する出力への文字列のリストが必要ですadd_one

開始するには、

nums = arr.map(&:to_i)

これは同じです

nums = arr.map do |str|
  str.to_i
end

あなたは見ることができRubyで意味:マップ(名前&)は何をしますか?この詳細については。

ただし、次のように呼び出すことはできません。

nums.map(&:add_one)

どうして?なぜなら、数値には組み込みのメソッドがないからですadd_one。したがって、を取得しNoMethodErrorます。

したがって、メソッド名 だけを提供するのではなく:add_oneバインドされたメソッドを 渡すことができますmethod(:add_one)

nums.map(&method(:add_one))

今、各NUMは以下のように使用されるのではなく、受信機のためのadd_one方法、それらは使用される引数。したがって、それは基本的に次のものと同じです:

nums.map do |num|
  add_one(num)
end

別の例として、以下を比較してください。

[1].map(&:puts)
# this is the same as [1].map { |num| num.puts }
# it raises NoMethodError

[1].map(&method(:puts))
# this is the same as [1].map { |num| puts num }
# it prints 1 successfully

Nitpick:Object#methodリターン界を Method、ではありませんUnboundMethod。このメソッドは、インスタンスで呼び出すためにレシーバーにバインドされており、それが何であるかを認識していますselfが、どのインスタンスで使用されるかを認識できないためにをModule#instance_method返しますUnboundMethod
イェルクWミッターク

JörgWMittag[OK]を@補正のためのおかげで、あなたは右の私はとそれを混同されている必要がありますされて.instance_method、私はちょうど(不備)メモリで行っていたので
最大pleaner

10

method(:function)あるメッセージ送信(とも呼ばれるメソッド呼び出しの暗黙的な受信機には)(すなわちself)。method暗黙の受信側(つまり、self)にメッセージを送信:functionし、唯一の引数として渡します。

:functionSymbolリテラルです。つまり、のリテラル表記ですSymbolSymbol「何かの名前」を表すデータ型です。

単項プレフィックスのアンパサンド&演算子はProc、aをブロックに「アンロール」します。つまりProcブロックが期待される場所を渡すことができます。オブジェクトがまだでない場合はProc、それto_proc自体をに変換することを許可するメッセージが送信されますProc。(演算子は、引数リストでのみ、最後の引数でのみ有効です。これは、&パラメーターリストのシギルの双対であり、ブロックをProcオブジェクトに「ロール」します。)

Proc実行可能コードを表すデータ型です。これは、ファーストクラスのサブルーチンのためのRubyのコアライブラリクラスです。

だから、これが何をするか、呼び出しているmethodのメソッドをself持つ:function引数として、コールto_procの戻り値に、「アンロール」結果Procにオブジェクトブロックとのコールにそのブロックを渡すintegrateようにあなたが書かれたかのような何か

res = integrate(0, 1, a) do
  # something
end

methodここでの方法は、最も可能性がありますObject#method返すメソッド、バインドされた Methodオブジェクトを。

つまり、全体として、これは次と同等です。

res = integrate(0, 1, a) do |*args, &block|
  function(*args, &block)
end

しかし、一般にポイントフリースタイルと呼ばれるもので表現されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.