저는 Zed Shaw의 Learn Ruby The Hard Way을 통해 작업 중이며 IRB에 모듈을 포함하여 문제가 있습니다. exercise 25에서 새 모듈 Ex25를 정의하고 IRB에서이를 요구 한 다음 해당 모듈의 네임 스페이스를 통해 다양한 방법을 사용할 수 있습니다. Ex25.break_words(sentence)
. 추가 크레디트에서는 include Ex25
을 타이핑하면 기본적으로 모듈의 메소드를 현재 "공간"(무엇을 호출해야할지 확실하지 않음)에 추가하고 모듈을 명시 적으로 참조하지 않고 호출 할 수 있습니다. break_words(sentence)
. 그러나이 작업을 수행 할 때 "정의되지 않은 메서드"오류가 발생합니다. 어떤 도움/설명이라도 대단히 감사하겠습니다.루비 포함 모듈을 IRB에
2
A
답변
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
에 응답하는 이유는 무엇입니까? include
은 Module
(및 해당 하위 클래스, Class
)의 인스턴스 메서드입니까? 답은 최상위 클래스가 싱글 톤 메소드를가집니다 ...
singleton_methods.include? "include" # => true
... 우리는 Object 클래스로 전달할 수 있다고 가정 할 수 있습니다.
+0
그건 완벽하게 효과가 있었고 정말 유익했습니다. 정말 고마워! – orenyk
몇 가지 코드를 보여주십시오. –
... 포함 할 호출을 포함하여 반환합니다. –