2013-10-24 11 views
6

रूबी क्लास Foo::Bar पर विचार करें।रूबी बनाम मॉड्यूल के साथ रूबी नेमस्पेसिंग?

सम्मेलन 'फू' नाम स्थान एक मॉड्यूल होने के लिए है, लेकिन यह बस के रूप में आसानी से एक वर्ग हो सकता है:

module Foo; class Bar; end; end 

बनाम:

class Foo; class Bar; end; end 

दूसरे मामले में, BarFoo की आंतरिक कक्षा नहीं है, यह Foo के सिंगलटन पर परिभाषित एक और स्थिर है। सुपरक्लास दोनों मामलों में ऑब्जेक्ट है और उनमें केवल कर्नेल मॉड्यूल शामिल है। उनके पूर्वजों की श्रृंखला समान हैं।

तो, संचालन के अलावा आप अपनी कक्षा के आधार पर Foo के साथ बना सकते हैं (यदि कक्षा में तत्काल हो, तो मॉड्यूल को विस्तारित/शामिल करें), क्या नामस्थान की प्रकृति Bar पर कोई प्रभाव डालती है? क्या किसी दूसरे पर नाम-अंतर को चुनने के लिए अनिवार्य कारण हैं?

एकमात्र अजीब चीजें जो मैं देखता हूं आप कर सकते हैं Foo::Bar.new.extend Foo और Foo.new.class::Bar क्रमशः।

class Foo 
    Bar = Struct.new(:something) do 
    def digest 
     puts "eating #{something}" 
    end 
    end 
    def eat(something) 
    Bar.new(something).digest 
    end 
end 

निकटतम मैं इस चर्चा करने के लिए मिला:

एक वर्ग एक वर्ग में परिभाषित की मेरा अपना सबसे आम उपयोग एक सहायक struct/वर्ग है कि केवल वर्ग द्वारा आंतरिक रूप से इस्तेमाल किया जा करने के लिए है हो सकता है "Using Class vs Module for packaging code in Ruby" में है।

+0

दिलचस्प है, मैं देख रहा हूँ वहाँ रेल में एक संबंधित मुद्दा था const_missing http://bugs.ruby-lang.org/issues/2740 – BF4

उत्तर

5

नेमस्पेसिंग के लिए मॉड्यूल का उपयोग कर के लिए सबसे तत्काल लाभ यह है कि आप include का उपयोग नाम स्थान आयात करने के लिए कर सकते हैं, और स्थिरांक के भीतर घोषित अयोग्य का उपयोग करें:

module Foo; class Bar; end; end 

module Elsewhere 
    include Foo 
    Bar.new 
end 
+0

ठीक है, मैं इसे एक दृढ़ तर्क के रूप में देख सकता हूं जहां मॉड्यूल का उपयोग करना * इरादा * में मिश्रित होना है। लेकिन यदि अधिकतर रत्नों की तरह नहीं, मणि के शीर्ष नेमस्पेस को मिलाकर मौजूदा स्थिरांक के साथ टकराव का कारण बनता है। – BF4

+0

बीटीडब्लू, अगर मुझे और जवाब नहीं मिलते हैं, तो मैं इसे स्वीकार करूंगा (मैंने इसे ऊपर उठाया), लेकिन मैं कुछ और पूरा करने की उम्मीद कर रहा था। – BF4

+2

निश्चित रूप से, धन्यवाद। एकमात्र अन्य कारण जिनके बारे में मैं सोच सकता हूं वे "सम्मेलन" और "इरादे की स्पष्टता" हैं, जिनमें से कोई भी उससे अधिक संतोषजनक नहीं है। कक्षा और मॉड्यूल यांत्रिक रूप से बहुत करीब हैं क्योंकि कक्षा वास्तव में मॉड्यूल का उप-वर्ग है जो तत्काल लागू करता है। मैंने सोचा है कि एक वास्तविक स्वतंत्र नेमस्पेस निर्माण अच्छा हो सकता है, लेकिन मुझे यकीन नहीं है कि यह वास्तव में कौन सा व्यवहार जोड़ देगा, इसलिए मैं देख सकता हूं कि यह मॉड्यूल के साथ अब क्यों किया गया है। –

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