2012-09-26 14 views
6

Çoklu Karışımlarda kullanıldığında include ifade davranışını anlamaya çalışıyorum."Sonraki" karışım modülleri için `include` deyim davranışını anlama

class Article < ActiveRecord::Base 
    include DoubleIncludedModule 
    include AModule 

    # ... 
end 

module AModule 
    include DoubleIncludedModule 

    # ... 
end 

module DoubleIncludedModule 
    # ... 
end 

kaç kere Article sınıfa dahil DoubleIncludedModule olacaktır: yani, ben bu ifadeleri var? Yani, DoubleIncludedModule'un (sonraki Article sınıfında ve ardından Article sınıfının kendisinde bulunan AModule'da yer alan "sonraki" eklenmesi), Ruby tarafından otomatik olarak işlenen "çift eklenme" sorunu olacak veya DoubleIncludedModule (yanlış) dahil edilecektir. iki kere?

Elbette, DoubleIncludedModule modülü modülünü yalnızca bir kez eklemek istiyorum. Bunu (belki de bazı Ruby on Rails yöntemlerini kullanarak) uygun şekilde nasıl yapabilirim?

+3

Sadece Rails kullandığınız için sorunun Rails ile ilgili bir anlamı olmadığı anlamına gelmez. Raylar, 'include' işlevinin nasıl çalıştığını değiştirmez. Bu tamamen bir Ruby sorusudur. –

+1

@Andrew Marshall - Bu, bazı sorunları olduğu gibi çözmeye yardımcı olabilecek bazı Ruby on Rails yöntemlerinde mevcut olabilir. – Backo

cevap

9

Ben bir örnekle cevap verecek:

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 

baskılar

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

Gördüğümüz gibi, M sadece bir kez C içine dahil edilir. teknik olarak, N'a dahil edildiğinden iki kez dahil edilmişti, bu da C'a dahil edildi. Bu önemli mi? Muhtemelen değil. Her biri sadece bir kez ata zincirinde bir kez gerçekleşir ve herhangi bir yöntem eşdeğer uygulamalarla geçersiz kılınırdı - yani aslında bir no-op. included kanca ile egzotik bir şey yapmıyorsanız, herhangi bir şey fark etmeniz mümkün değildir.