2014-01-16 2 views
2

저는 Zed Shaw의 Learn Ruby The Hard Way을 통해 작업 중이며 IRB에 모듈을 포함하여 문제가 있습니다. exercise 25에서 새 모듈 Ex25를 정의하고 IRB에서이를 요구 한 다음 해당 모듈의 네임 스페이스를 통해 다양한 방법을 사용할 수 있습니다. Ex25.break_words(sentence). 추가 크레디트에서는 include Ex25을 타이핑하면 기본적으로 모듈의 메소드를 현재 "공간"(무엇을 호출해야할지 확실하지 않음)에 추가하고 모듈을 명시 적으로 참조하지 않고 호출 할 수 있습니다. break_words(sentence). 그러나이 작업을 수행 할 때 "정의되지 않은 메서드"오류가 발생합니다. 어떤 도움/설명이라도 대단히 감사하겠습니다.루비 포함 모듈을 IRB에

+0

몇 가지 코드를 보여주십시오. –

+0

... 포함 할 호출을 포함하여 반환합니다. –

답변

5

이것은 책의 오류입니다. Ex25의 메소드는 클래스 메소드입니다. include인스턴스 메서드를 "현재 공간"에 추가합니다. 메소드 정의에서 self를 제거하고 작동합니다 : 당신이 궁금하다면

module Ex25 
    def break_words(stuff) 
    stuff.split(' ') 
    end 
end 

include Ex25 
break_words 'hi there' # => ["hi", "there"] 

이 여기에 무슨 일이 일어나고 있는지에 대해 좀 더 자세히입니다 : 방법이 — "현재 공간을"포함 된 장소 —가있다 Object 클래스 :

Object.included_modules # => [Ex25, Kernel] 

모든 개체 인스턴스가 포함 방법을 얻을 ...

Object.new.break_words 'how are you?' # => ["how", "are", "you?"] 

... 그리고 최상위 수준은 Object 인스턴스입니다.

하지만 기다려. 최상위 수준이 Object 인스턴스 인 경우 include에 응답하는 이유는 무엇입니까? includeModule (및 해당 하위 클래스, Class)의 인스턴스 메서드입니까? 답은 최상위 클래스가 싱글 톤 메소드를가집니다 ...

singleton_methods.include? "include" # => true 

... 우리는 Object 클래스로 전달할 수 있다고 가정 할 수 있습니다.

+0

그건 완벽하게 효과가 있었고 정말 유익했습니다. 정말 고마워! – orenyk