के बिना ऑटोलोडिंग कक्षाएं मुझे the autoload functionality of Ruby पसंद है; हालांकि, यह going away in future versions of Ruby है क्योंकि यह कभी थ्रेड-सुरक्षित नहीं था।रुबी में अपने 'ऑटोलोड'
तो अभी मैं यह दिखाऊंगा कि यह पहले से ही चला गया है और इसके बिना अपना कोड लिखना है, आलसी लोडिंग तंत्र को स्वयं लागू करना। मैं इसे सबसे सरल तरीके से कार्यान्वित करना चाहता हूं (मुझे अभी थ्रेड-सुरक्षा की परवाह नहीं है)। रूबी हमें ऐसा करने की अनुमति देनी चाहिए।
class Dummy
def self.const_missing(const)
puts "const_missing(#{const.inspect})"
super(const)
end
end
रूबी इस विशेष विधि जब हम "डमी" गुम है, तो उदाहरण के लिए अगर हम संदर्भ के लिए "डमी कोशिश के तहत एक निरंतर संदर्भ के लिए कोशिश कॉल करेगा: एक वर्ग 'const_missing
बढ़ाने से
आइए शुरू: : हैलो ", यह const_missing
को प्रतीक :Hello
के साथ कॉल करेगा। यह ठीक है कि हम क्या जरूरत है, तो चलो इसे आगे ले जाने: अब
class Dummy
def self.const_missing(const)
if :OAuth == const
require 'dummy/oauth'
const_get(const) # warning: possible endless loop!
else
super(const)
end
end
end
अगर हम संदर्भ "डमी :: OAuth", यह "डमी/oauth.rb" फाइल जो परिभाषित "की उम्मीद है की आवश्यकता होगी डमी :: ओथ "निरंतर। जब हम const_get
पर कॉल करते हैं तो अंतहीन पाश की संभावना होती है (क्योंकि यह आंतरिक रूप से const_missing
पर कॉल कर सकती है), लेकिन इसके खिलाफ सुरक्षा इस प्रश्न के दायरे से बाहर है।
बड़ी समस्या है, इस पूरे समाधान अगर वहाँ शीर्ष स्तर के नाम स्थान में "OAuth" नामक एक मॉड्यूल मौजूद टूट जाती है। "डमी :: ओएथ" का संदर्भ देने से const_missing
छोड़ दिया जाएगा और केवल शीर्ष स्तर से "ओथ" वापस कर दिया जाएगा। अधिकांश रूबी कार्यान्वयन भी इस बारे में एक चेतावनी देगा:
warning: toplevel constant OAuth referenced by Dummy::OAuth
This was reported as a problem way back in 2003 लेकिन मैं सबूत नहीं मिला है कि रूबी कोर टीम कभी भी इस बारे में चिंतित था। आज, सबसे लोकप्रिय रूबी कार्यान्वयन एक ही व्यवहार लेते हैं।
समस्या यह है कि const_missing
चुपचाप शीर्ष-स्तर के नामस्थान में निरंतर के पक्ष में छोड़ दिया गया है। यह तब नहीं होगा जब "डमी :: ओथ" रूबी के autoload
कार्यक्षमता के साथ घोषित किया गया था। कोई विचार यह कैसे काम करता है?
यह एक मूर्खतापूर्ण सुझाव की तरह लगता है, लेकिन आप 'autoload' की सी स्रोत देख सकते हैं? मुझे यकीन है कि आप इसे रूबी स्रोत में कहीं भी पा सकते हैं। यदि आप इसे सीधे रुबी में नहीं कर सकते हैं, तो सी एक्सटेंशन बनाने का विकल्प है (जिसमें दुभाषिया के निडरता तक पहुंच है)। – Linuxios
यह एक विकल्प है। – mislav
एक क्रूर बल की बात की तरह लगता है, लेकिन क्या आप शीर्ष-स्तर की कक्षा पर 'remove_const' नहीं कर सकते? – phoet