2012-09-26 4 views
6

여러 Mixins에서 사용할 때 include 문 동작을 이해하려고합니다."후속"mixin 모듈에 대한 'include'문 동작 이해

class Article < ActiveRecord::Base 
    include DoubleIncludedModule 
    include AModule 

    # ... 
end 

module AModule 
    include DoubleIncludedModule 

    # ... 
end 

module DoubleIncludedModule 
    # ... 
end 

몇 번 Article 클래스에 포함 된 DoubleIncludedModule 될 것입니다 : 즉, 나는이 문장이 있습니까? 즉, DoubleIncludedModule (처음에는 Article 클래스에 포함 된 후 Article 클래스에 포함 된 클래스에 포함됨)은 Ruby에서 자동으로 처리되는 "이중 포함"문제이거나 DoubleIncludedModule (잘못 포함됨)이 포함됩니다. 두 번?

물론 모듈 을 포함하고 싶습니다.. 적절한 방법으로 (Ruby on Rails 메서드를 사용하여) 어떻게 만들 수 있습니까?

+3

Rails를 사용하고 있다고해서 Rails와 관련이있는 것은 아닙니다. Rails는'include '가 어떻게 작동 하는지를 변경하지 않는다. 이것은 순전히 루비 질문입니다. –

+1

@Andrew Marshall - 질문 에서처럼 일부 문제를 해결하는 데 도움이되는 Ruby on Rails 방법이있을 수 있습니다. – Backo

답변

9

내가 예와 함께 답변 해 드리겠습니다 :

module M 
    def self.included base 
    puts "M included in #{base}" 
    end 
end 

module N 
    include M 

    def self.included base 
    puts "N included in #{base}" 
    end 
end 

class C 
    include M 
    include N 
end 

p C.ancestors 

인쇄

M included in N 
M included in C 
N included in C 
[C, N, M, Object, Kernel, BasicObject] 

우리가 볼 수 있듯이, M 한 번만 C에 포함되어 있습니다. 기술적으로는 이었지만 N에 포함 되었기 때문에 두 번 포함되었지만 C에도 포함되었습니다. 이게 중요합니까? 아마도 그렇지 않습니다. 각각은 여전히 ​​선조 체인에서 한 번만 발생하며, 모든 메소드가 동일한 구현 (즉, 본질적으로 아무 작업도 수행하지 않음)으로 대체되었습니다. included 후크로 이국적인 것을하지 않는다면 아무 것도 느끼지 않을 것입니다.