あなたがprintv
ためのコードを見れば、あなたはg
がcall
方法を提供する必要があることがわかります。あなたはそれを参照するように記号(:hello
)を必要としないので、ここで
hello = lambda { |name| puts "Hello, #{name}" }
printv(hello) # prints: Hello, Fred and Hello, Amber
hello
ラムダを格納する変数は、デフォルトでcall
方法を提供するRubyでいくつかのクラスは、それらの中のprocsとラムダがあり、 。
ここで、方法method
を見てみましょう。ドキュメントによると、名前付きメソッドをobjの受信者として呼び、Methodオブジェクトを返す(またはNameErrorを呼び出す) "。それは "obj.method(sym)→method"であり、シンボル引数をとり、method objectを返します。現在method(:hello)
に電話をかけた場合は、現在は「hello」という名前のメソッドがないため、ドキュメントにはNameError
が記載されています。すぐに1を定義すると、物事がが動作します:method
は、メソッドオブジェクトを抽出しようとしますが、そこに次の場合に失敗します。
def hello(name)
"Hello, #{name}"
end
method(:hello) #=> #<Method: Object#hello>
>> printv(method(:hello)) # works as expected
を使用すると、他の答えにあなたのコメントに言及コールprintv(method("hello")
が失敗した理由についても説明しますその名前ではメソッドがありません(引数が途中で動作するように見える文字列は、場合によってはmethod
インターンのように見えます)。
マイケルに感謝します! – Ava
喜んで:-) –