2010-06-11 14 views
5

मुझे लंबे समय से पता चला है कि रुबी में "स्थिरांक" (यानी, परिवर्तनीय नाम जो पूंजीकृत हैं) वास्तव में स्थिर नहीं हैं। अन्य प्रोग्रामिंग भाषाओं की तरह, किसी ऑब्जेक्ट का संदर्भ वैरिएबल/स्थिर में संग्रहीत एकमात्र चीज है। (साइडबार: रूबी में संशोधित वस्तुओं को संशोधित करने से "फ्रीज" करने की सुविधा है, जहां तक ​​मुझे पता है, कई अन्य भाषाओं में दी जाने वाली क्षमता नहीं है।)रूबी में निरंतर पुनः आवंटित करते समय अपवाद फेंको?

तो मेरा प्रश्न यहां है: जब आप पुनः- एक निरंतर में एक मूल्य निर्दिष्ट, तुम इतनी तरह एक चेतावनी मिलती है:

>> FOO = 'bar' 
=> "bar" 
>> FOO = 'baz' 
(irb):2: warning: already initialized constant FOO 
=> "baz" 

वहाँ एक अपवाद फेंक करने के बजाय एक चेतावनी मुद्रण रूबी मजबूर करने के लिए एक तरीका है? कभी-कभी पुन: असाइनमेंट क्यों होता है यह पता लगाना मुश्किल है।

उत्तर

5

this question पर देखें कि कुछ मामलों में त्रुटियों के रूप में चेतावनियों का इलाज कैसे किया जा सकता है।

अन्यथा मुझे लगता है कि आपको स्थिरांक आवंटित करने के लिए एक कस्टम विधि लिखनी होगी और अगर पहले ही असाइन किया गया है तो अपवाद बढ़ाएं।

यदि आप जानते हैं कि एक असाइनमेंट निरंतर स्थिरता के साथ होता है, तो आप असाइनमेंट से ठीक पहले एक सैनिटी चेक भी जोड़ सकते हैं।

+0

दूसरे प्रश्न को इंगित करने के लिए धन्यवाद - मैंने इसके लिए 'कर्नेल.वर्न'' का उपयोग करने के बारे में सोचा नहीं होगा। ऐसा लगता है कि निरंतर पुन: असाइनमेंट इसका उपयोग नहीं करता है। –

+0

मैंने वास्तव में कोशिश नहीं की थी; लेकिन मैं कल्पना कर सकता हूं कि निरंतर असाइनमेंट भाषा का हिस्सा हो सकता है और इस प्रकार सी कोड में संभाल सकता है। इस मामले में इसमें हुक करना मुश्किल होगा, अकेले रूबी अपवाद उठाएं। – averell

3

आप इसे सीधे रोक नहीं सकते हैं, नहीं।

यदि आप वास्तव में ऐसा करने की आवश्यकता है, तो मैं एक बहुत गंदे हैक के बारे में सोच सकता हूं। आप कस्टम आईओ ऑब्जेक्ट में मानक त्रुटि IO को रीडायरेक्ट कर सकते हैं। write विधि तब लिखा जा सकता है कि क्या लिखा जा रहा है; यदि इसमें "warning: already initialized constant" है, तो आप raise करते हैं, अन्यथा आप कॉल को मानक त्रुटि के write पर अग्रेषित करते हैं।

+0

यह वास्तव में काम करेगा। * बहुत * रचनात्मक दृष्टिकोण, हालांकि;) – averell

+0

असल में, यह मूल रूप से आप जो महान जवाब देते हैं, वह कह रहा है ... हमने उसी समय पोस्ट किया होगा, क्योंकि मैंने पोस्ट किए जाने पर इसे पढ़ा नहीं था। –

0

तो लगातार एक वर्ग या एक मॉड्यूल के भीतर है, तो आप वर्ग या मॉड्यूल freeze सकता है:

# Normal scenario 
$VERBOSE = true 
class Foo 
    BAR = 1 
end 

Foo::BAR = 2 # warning: already initialized constant BAR 
# Using freeze 
Foo.freeze 
Foo::BAR = 3 
RuntimeError: can't modify frozen Class 
    from (irb):8 
    from /Users/agrimm/.rbenv/versions/1.9.3-p194/bin/irb:12:in `<main>' 

अपने परिदृश्य के लिए, आप Object फ्रीज सकता है, लेकिन उस तरह का डरावना लग रहा है।

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