2014-09-29 2 views
0

두 클래스가 있습니다. 나는 그것들을 네임 스페이스하고 싶다. 또한 공유하는 기능이 약간 있습니다. 나는 다음과 같이한다 :모듈 내의 클래스에 모듈 포함

module Talker 
    def say_bye 
    puts 'bye' 
    end 

    class Bob 
    include Talker 
    def say_yo 
     puts 'yo' 
    end 
    end 

    class Tom 
    include Talker 
    def say_hello 
     puts 'hello' 
    end 
    end 
end 

이들은 모두 유효한 메서드 호출이다.

Talker::Bob.new.say_yo 
Talker::Bob.new.say_bye 
Talker::Tom.new.say_hello 
Talker::Tom.new.say_bye 

내가 들었다 ".이 include 다시 Bob를 포함하는 것입니다 당신은 Talker를 포함하는 클래스를 시작하기 전에 Talker 모듈을 닫아야합니다." 예기치 않은 루비 동작을 초래하거나 뭔가 금기시하는 뭔가를하고 있다면 나에게 설명 할 수 있습니까? 이 모듈을 그 모듈 내의 클래스 내부에서 포함시키는 것은 나쁜 습관입니까? 이 패턴에 대한 비판은 무엇일까요? 여기에 상속을 사용해야합니까?

+0

'Bob.new.say_yo' 등은 (주 환경에서) 유효합니까? – sawa

+0

귀하의 예에서는 오류가 발생하지 않습니다 – mdesantis

+0

수정 됨 : 클래스 앞에 네임 스페이스가 없기 때문에 호출이 작동하지 않았습니다. 문제는 "왜 작동하지 않는가"또는 "왜 오류입니까?"가 아닙니다. 그것은 효과적이고 오류없이 작동합니다. 질문은 A)이 작업을해도 괜찮습니까? 그리고 B) 제가 장면 뒤에서 모르는 나쁜 일을하고 있습니까? –

답변

0

나는 그것을 알아 냈다. 포함은 다소 재귀 적으로 끝납니다. 위의 코드는 다음과 같은 작업을 수행합니다.

Talker::Bob::Bob 
Talker::Bob::Tom 
Talker::Bob::Bob::Bob::Tom::Bob::Tom 

그리고이 것은 아닙니다. 그래서 모듈을 포함하는 각 클래스에 모듈의 다른 클래스를 다시 포함시킬 것이라고 말했을 때 그는 옳았다.