どういう&method(:function)意味ですか?たとえば、次の行があります。
res = integrate(0, 1, a, &method(:function))
どういう&method(:function)意味ですか?たとえば、次の行があります。
res = integrate(0, 1, a, &method(:function))
回答:
メソッドがあるとしましょう
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
Object#methodリターン界を Method、ではありませんUnboundMethod。このメソッドは、インスタンスで呼び出すためにレシーバーにバインドされており、それが何であるかを認識していますselfが、どのインスタンスで使用されるかを認識できないためにをModule#instance_method返しますUnboundMethod。
.instance_method、私はちょうど(不備)メモリで行っていたので
method(:function)あるメッセージ送信(とも呼ばれるメソッド呼び出しの暗黙的な受信機には)(すなわちself)。method暗黙の受信側(つまり、self)にメッセージを送信:functionし、唯一の引数として渡します。
:functionはSymbolリテラルです。つまり、のリテラル表記ですSymbol。Symbol「何かの名前」を表すデータ型です。
単項プレフィックスのアンパサンド&演算子は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
しかし、一般にポイントフリースタイルと呼ばれるもので表現されます。