2012-09-26 8 views
6

मैं एकाधिक मिक्सिन में उपयोग किए जाने पर include कथन व्यवहार को समझने की कोशिश कर रहा हूं।"बाद में" मिश्रण मॉड्यूल के लिए 'शामिल' कथन व्यवहार को समझना

class Article < ActiveRecord::Base 
    include DoubleIncludedModule 
    include AModule 

    # ... 
end 

module AModule 
    include DoubleIncludedModule 

    # ... 
end 

module DoubleIncludedModule 
    # ... 
end 

DoubleIncludedModuleArticle वर्ग में शामिल कितनी बार हो जाएगा: जो है, मैं इन बयानों है? DoubleIncludedModule (पहले Article वर्ग में पहले और AModule में "Article वर्ग द्वारा स्वयं" शामिल होने के बाद से, "रूबी द्वारा स्वचालित रूप से संभाला गया" डबल समावेश "मुद्दा होगा या DoubleIncludedModule (गलत तरीके से) शामिल होगा दो बार?

बेशक, मैं DoubleIncludedModule मॉड्यूल केवल एक बार शामिल करना चाहता हूं। मैं इसे कैसे कर सकता हूं (संभवतः रेल मार्गों पर कुछ रूबी का उपयोग करके) उचित तरीके से?

+3

सिर्फ इसलिए कि आप रेल का उपयोग कर रहे हैं इसका मतलब यह नहीं है कि सवाल रेल के साथ कुछ भी नहीं है। रेल बदलता नहीं है कि कैसे 'शामिल' काम करता है। यह पूरी तरह से एक रूबी सवाल है। –

+1

@ एंड्रयू मार्शल - यह रेलवे विधियों पर कुछ रूबी मौजूद हो सकता है जो कि कुछ मुद्दों को हल करने में मदद कर सकते हैं। – 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] 

हम देख सकते हैं, MC में केवल एक बार शामिल किया गया है। हालांकि तकनीकी रूप से इसे दो बार शामिल किया गया था क्योंकि इसे N में शामिल किया गया था जिसे C में भी शामिल किया गया था। क्या इससे कोई फर्क पड़ता है? शायद ऩही। प्रत्येक अभी भी पूर्वजों की श्रृंखला में केवल एक बार होता है, और किसी भी तरीके को समकक्ष कार्यान्वयन के साथ ओवरराइड किया गया था-यानी, अनिवार्य रूप से नो-ऑप। जब तक आप included हुक के साथ कुछ विदेशी नहीं कर रहे हैं, तो आपको कुछ भी ध्यान देने की संभावना नहीं है।

संबंधित मुद्दे