0

次の例は、クラスで私の教授によって示され、完全に正常に機能し、印刷されました

def printv(g)
  puts g.call("Fred")
  puts g.call("Amber")
end

printv(method(:hello))

>>hello Fred

  hello Amber

しかし、irb/RubyMine で実行しようとすると、未定義のメソッド エラーが表示されます。彼がクラスで示した正確なコードを試しています。私は何が欠けていますか?

ありがとう!

4

2 に答える 2

4

のコードを見ると、メソッドを提供する必要が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念のためその議論)。

于 2011-09-17T22:17:02.193 に答える
3

メソッド「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 
于 2011-09-17T20:26:16.517 に答える