2011-03-10 9 views
0

그래서 나는 루비를 배울 것이라고 생각했습니다. 나는 통역사와 놀고 있었지만 더 큰 프로그램을 만들고 싶었 기 때문에 IDE 인 Aptana를 다운로드했습니다. 이 코드를 실행하려고하면 :왜 메소드를 호출 할 수 없습니까?

class HelloWorld 
    def h 
     puts "hello World!" 
    end 
    h 
end 

이렇게하면 h가 정의되지 않은 지역 변수라는 오류가 발생합니다. 인터프리터에 명령을 입력하면 (클래스 시작 및 종료없이) 원하는 방식으로 호출됩니다.

저는 여기를 잃고 있습니다. 무슨 일이야?

+2

축하 스택 오버플로에 2만번째 루비 질문에! –

답변

0

범위가 class 인 동안 h 메시지를 보냈습니다.

:

당신은 HelloWorld의 다른 인스턴스 메소드에서 h을 보낼 수 있습니다 (I 완전히 틀렸다면, 내 사과를 받아, 또한 좀 더 루비 경험을 가진 일부 사람들은 여기 내 표현을 정정 할 것이라 확신합니다.)

class HelloWorld 
    def h; puts "hello world!"; end 

    def g 
    h 
    end 
end 

HelloWorld.new.g 
# => "hello world!" 
+0

그런 식으로 h를 래핑 할 필요는 없습니다. 메소드 g와 그 정의를 생략하고 "HelloWorld.new.h"를 발행하여 h를 호출 할 수있다. – RubyFanatic

+0

물론! 클래스 정의 내에서 메서드를 호출하는 방법을 방공호에 표시했습니다. –

0

당신은 그런 식으로 전화를 할 수있는 수준의 방법으로 시간을 정의하기 위해 필요한이

class HelloWorld 
    def self.h 
    puts "hello World!" 
    end 
    h # you can only call h like this if it is defined as a class method above 
end 

HelloWorld.h # you can call the class method like this also 

보십시오. 또는 대체 할 수 있습니다.

class HelloWorld 
    def h 
    puts "hello World!" 
    end 
end 

a = HelloWorld.new # instantiate a new instance of HelloWorld 
a.h 

행운을 빈다.

+1

'self.h' 예제에서 클래스 내부에서 메소드'h'를 호출 할 수 있습니다. –

+0

아 감사합니다 ... 나는 그것을 몰랐다! – RubyFanatic

3

클래스를 정의 할 때 정의하는 메소드는 instance 메소드입니다. 이것은 당신이 지금처럼 그들을 부를 것이다 의미

class HelloWorld 
    def h 
    puts "hello world!" 
    end 
end 

instance = HelloWorld.new 
instance.h 

루비 클래스 본문을 정의하는 동안, 한 모든 함수 호출이 class 방법 (또는 singleton 방법)에 있으며, 때문에 방법이 존재하지 않는다고 불평한다. 당신이 정말로 이렇게하고 싶다면

, 당신과 같이 그것을 할 것입니다 :

class HelloWorld 
    def self.h 
    puts "hello World!" 
    end 
    h 
end 
관련 문제