のコードを見ると、メソッドを提供する必要がprintv
あることがわかります。Rubyには、デフォルトでメソッドを提供するクラスがいくつかあります。その中には、procsとlambdasがあります。g
call
call
hello = lambda { |name| puts "Hello, #{name}" }
printv(hello) # prints: Hello, Fred and Hello, Amber
これはラムダhello
を格納する変数であるため、それを参照するために記号()は必要ありません:hello
。
それでは、メソッドを見てみましょうmethod
。ドキュメントによると、「[l]名前付きメソッドをobjのレシーバーとして検索し、メソッドオブジェクトを返します(またはNameErrorを発生させます)」。シグネチャは「obj.method(sym)→method」です。これは、シンボル引数を取り、メソッドオブジェクトを返すことを意味します。method(:hello)
今すぐ呼び出すと、NameError
現在「hello」という名前のメソッドがないため、ドキュメントに記載されています。1つを定義するとすぐに、次のことが機能します。
def hello(name)
"Hello, #{name}"
end
method(:hello) #=> #<Method: Object#hello>
>> printv(method(:hello)) # works as expected
printv(method("hello")
これは、他の回答のコメントで言及した呼び出しが失敗する理由も説明しています。メソッドオブジェクトを抽出しようとしますが、その名前のメソッドがない場合は失敗します(引数としての文字列は、インターンmethod
のように見えます)method
念のためその議論)。