2010-08-10 1 views
3

이것은 이론적으로 엄격합니다.모듈의 instance_method를 호출 할 수 있습니까?

module BleeTest 
    def meth 
    puts 'foo' 
    end 
end 

이 코드는 오류없이 실행되지만 "meth"메서드를 호출 할 수 있습니까?

"meth"는 인스턴스화 할 수없는 모듈의 인스턴스 메소드입니다. 그렇다면이 통역사가 왜이 구성을 허용합니까?

답변

8

물론 가능합니다.

o = Object.new 
o.extend BleeTest 

o.meth 
# foo 

또는 당신은 클래스로 BleeTest을 혼합 할 수 있습니다 : 당신은 객체로 BleeTest를 혼합 할 수

class C 
    include BleeTest 
end 

o = C.new 

o.meth 
# foo 

사실, 첫 번째 양식은 또한 두 번째 형태로 표현 될 수있다 :

o = Object.new 

class << o 
    include BleeTest 
end 

o.meth 
# foo 

즉, 결국, MODU의 요점입니다 les in Ruby : 객체와 클래스를 작성하기 위해 믹스 인으로 사용됩니다.

+0

'BleeTest'의 하위 클래스의 인스턴스에만 메서드를 바인딩 할 수 있습니다. 'm.bind (o) .call # => TypeError : 바인드 인자는 BleeTest'의 인스턴스 여야합니다. 이렇게하면 잘 작동합니다 :'o.extend (BleeTest); m.bind (o) .call # => foo' – horseyguy

+0

감사합니다. 귀사가 읽고있는 일부 보석 소스 코드를 명확히하는 데 도움이됩니다. – user258980

+0

@banister : 당신 말이 맞아요. 필자의 IRB 기록을 살펴보면 위의 코드를 테스트하는 동안 복사 및 붙여 넣기 오류가 발생했습니다. 어떻게 든 빗나간'include BleeTest '이 내 클립 보드에 저장되었습니다. 최상위 레벨의'include Foo'는'Foo'를'Object'에 섞어서 테스트 해 보았습니다. 이것은 보여줄 것입니다 : 항상 신선한 환경에서 시험하십시오! –

관련 문제