Ruby의 믹스 인 메소드에 대한 기사 (extend
및 include
)를 읽었으며 여전히 동작에 대해 확신하지 못했습니다. 제가 extend
가 연장하고있는 모듈 단일 메소드로 지정된 모듈 인스턴스 메소드를 추가 할 것이라는 및 include
본질적 효과적으로 정의를 포함하고있는 하나의 모듈의 내용 (방법 상수, 변수)을 추가 할 것을 이해 그것들을 수신기에.Ruby 믹스 : 확장 및 포함
그러나 일부 땜질 후, 행동이 명시하는 방법에 대한 느낌을 얻을려고, 나는 몇 가지 질문 있어요. 여기 내 테스트 설정입니다 : 그래서
module Baz
def blorg
puts 'blorg'
end
end
module Bar
include Baz
def blah
puts 'blah'
end
end
module Foo
extend Bar
end
class Bacon
extend Bar
end
class Egg
include Bar
end
나는, 모듈 Bar
이익 인스턴스로 인해 포함 방법과 그들이 자체에 정의 된 것처럼 Baz
(#blorg
)에 정의 된 메소드 및 클래스 Bacon
이익을 예상하는대로 싱글 방법 나아가서 Bacon::blah
및 Bacon::blorg
.
Bacon.blah # => blah
Bacon.blorg # => blorg
그리고 클래스 Egg
이익 인스턴스 메소드로 Bar
(지금 #blah
및 #blorg
)에 정의 된 방법.
Egg.new.blah # => blah
Egg.new.blorg # => blorg
나는 모두 그렇게 얻을 수있다.
그러나, 나는 내가 #ancestors
및 #is_a?
방법을 사용에게서 얻는 반응을 이해하지 않습니다.
Bacon.ancestors # => [Bacon, Object, Kernel, BasicObject]
Bacon.is_a? Bar # => true
Egg.ancestors # => [Egg, Bar, Baz, Object, Kernel, BasicObject]
Egg.is_a? Bar # => false
그 모듈에 대해 조회 할 때 모듈을 연장 true
를 반환하는 #is_a?
방법을 일으키는 것 같다,하지만이 클래스의 조상에 추가되지 않으며, 포함에 관해서 반대 :의 조상 클래스는 모듈이 포함되어 포함되어 있지만 쿼리 할 때 #is_a?
방법은 false
를 반환합니다. 왜 이런 일이 생길까요?
+1이 질문의 위대한 형식입니다. – sargas