2011-09-17 5 views
0

에 다음의 예는 클래스 내 교수 보였다과 완벽하게 잘 작동하고정의되지 않은 방법 오류가 루비

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

printv(method(:hello)) 

>>hello Fred 

    hello Amber 

를 인쇄하지만 난 내 IRB/RubyMine에서 실행하려고 할 때 그 정의되지 않은 방법의 오류를 보여주는 . 나는 그가 수업에서 보여준 것과 똑같은 코드를 시도하고있다. 내가 뭘 놓치고 있니?

감사합니다.

답변

4

, 당신은 gcall 방법을 제공해야합니다 것을 볼 수 있습니다. 당신이 그것을 참조하는 심볼 (:hello)를 필요가 없습니다 여기

hello = lambda { |name| puts "Hello, #{name}" } 
printv(hello) # prints: Hello, Fred and Hello, Amber 

hello 람다를 저장하는 변수이다 : 기본적으로 call 방법을 제공 루비의 여러 클래스는 그들의 사이에 발동 및 람다가있다 .

이제 method 메서드를 살펴 보겠습니다. docs에 따르면, "명명 된 메소드를 obj의 수신자로 만들고, Method 객체를 반환하거나 NameError를 발생시킵니다." 그것의 서명은 "obj.method (sym) → method"입니다. 이것은 심볼 인수를 취하여 method object을 반환한다는 것을 의미합니다. 현재 method(:hello)으로 전화하면 "hello"라는 메서드가 없기 때문에 문서에 언급 된 NameError이 표시됩니다. 즉시 하나를 정의로, 가지가 있지만 작동합니다

def hello(name) 
    "Hello, #{name}" 
end 
method(:hello) #=> #<Method: Object#hello> 
>> printv(method(:hello)) # works as expected 

를 이것은 또한 당신이 다른 대답에 귀하의 코멘트에 언급 전화 printv(method("hello") 실패 이유를 설명 : method 시도를하는 방법 객체를 추출 할 수 있지만 경우가 실패 그 이름으로는 메소드가 없습니다. (인자는 인자로 쓰이기 때문에 문자열은 method 인턴의 경우 인자로 쓰입니다).

+0

Michael! – Ava

+0

다행히 도와 드리겠습니다 :-) –

3

"hello"메소드도 정의해야합니다. 당신이 printv의 코드를 보면

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 (method ("hello"))'도 정의되어 있지 않다. – Ava

+0

또한 같은 에러가 난다. – Ava