2011-09-17 12 views
0

に、次の例は、クラスで私の教授によって示された、それは完全に罰金働いたと未定義のメソッドのエラーは、Ruby

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

printv(method(:hello)) 

>>hello Fred 

    hello Amber 

を印刷しますが、私は私のIRB /ルビーマイン上でそれを実行しようとしているときには、未定義のメソッドエラーを示します。私は彼がクラスで示したものを正確なコードにしようとしています。私は何が欠けていますか?

ありがとうございます!

答えて

4

あなたがprintvためのコードを見れば、あなたはgcall方法を提供する必要があることがわかります。あなたはそれを参照するように記号(: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インターンのように見えます)。

+0

マイケルに感謝します! – Ava

+0

喜んで:-) –

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 
+0

私はこのように電話するとどうなりますか? 'printv(メソッド(" hello "))'も定義されていません – Ava

+0

また同じエラーが発生しています – Ava

関連する問題