एक मणि को देखते हुए जो मैंने लिखा है कि कुछ कोड के साथ संघर्ष करने वाले शीर्ष-स्तरीय वर्गों को परिभाषित करता है, क्या इस तरह के मणि की आवश्यकता होती है कि इसकी सभी कक्षाओं को मॉड्यूल के अंदर समूहीकृत किया जाए मैं परिभाषित कर सकता हूँ? उदाहरण के लिए, एक unsafe_gem एक वर्ग को परिभाषित करता है, तो:उपयोगकर्ता द्वारा परिभाषित नामस्थान में रूबी मणि लोड करें
class Word
# ... some code
end
मैं की तरह कुछ की आवश्यकता होगी:
class Word
# My word class.
end
module SafeContainer
# This obviously doesn't work
# (i.e. the gem still defines ::Word).
require 'unsafe_gem'
end
तो यह है कि मैं अलग कर सकते हैं के बीच:
Word.new # => The class I defined.
SafeContainer::Word.new # => The class defined by the gem.
कुछ अधिक जानकारी: मेरा कोड (उदाहरण के लिए 'वर्ड' क्लास) पहले से ही अपने नामस्थान में लपेटा गया है। हालांकि, मैं उपयोगकर्ता को "सिंटेक्टिक चीनी" के रूप में सक्षम करने के विकल्प के साथ प्रदान करने में सक्षम होना चाहता हूं, जो कुछ वर्गों को शीर्ष-स्तर के नामस्थान के नीचे सीधे पहुंच योग्य बनाता है। हालांकि, यह एक रत्न का उपयोग कर रहा है जिसमें से एक रत्न का उपयोग कर रहा हूं, जो एक शीर्ष-स्तरीय वर्ग को परिभाषित करता है। वर्तमान में प्रस्तावित समाधानों में से कोई भी काम नहीं करता है क्योंकि मणि वास्तव में इसकी वैश्विक स्तर पर परिभाषित कक्षा पर निर्भर करता है; इसलिए वर्ग को अपरिभाषित करने से मणि टूट जाता है। बेशक, मणि में एक से अधिक फाइलें हैं, और व्यक्तिगत रूप से मॉड्यूल में अपनी फाइलों की आवश्यकता होती है, यह बहुत ही भंगुर समाधान लगता है। वर्तमान में, केवल वैकल्पिक हल मैं पाया है यह है:
begin
# Require the faulty gem.
require 'rbtagger'
rescue
# If syntactic sugar is enabled...
if NAT.edulcorated?
# Temporarily remove the sugar for the clashing class.
Object.const_unset(:Word); retry
else; raise; end
ensure
# Restore syntactic sugar for the clashing class.
if NAT.edulcorated?
Object.const_set(:Word, NAT::Entities::Word)
end
end
मैं पता नहीं क्यों, लेकिन यह मेरे toenails कर्ल बनाता है। किसी के पास बेहतर समाधान है?