次の例は、クラスで私の教授によって示され、完全に正常に機能し、印刷されました
def printv(g)
puts g.call("Fred")
puts g.call("Amber")
end
printv(method(:hello))
>>hello Fred
hello Amber
しかし、irb/RubyMine で実行しようとすると、未定義のメソッド エラーが表示されます。彼がクラスで示した正確なコードを試しています。私は何が欠けていますか?
ありがとう!
のコードを見ると、メソッドを提供する必要がprintvあることがわかります。Rubyには、デフォルトでメソッドを提供するクラスがいくつかあります。その中には、procsとlambdasがあります。gcallcall
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念のためその議論)。
メソッド「hello」も定義する必要があります。
def printv(g)
puts g.call("Fred")
puts g.call("Amber")
end
def hello(s)
"hello #{s}"
end
printv(method(:hello))
>>hello Fred
hello Amber