2011-03-18 13 views
11

about_symbols.rb रूबी कोआन (https://github.com/edgecase/ruby_koans) में हो जाते हैं, मैं निम्नलिखित कोड है:रूबी कोआन: स्थिरांक प्रतीकों

RubyConstant = "What is the sound of one hand clapping?" 
    def test_constants_become_symbols 
     all_symbols = Symbol.all_symbols 

     assert_equal true, all_symbols.include?(:"nonexistent") 

     assert_equal true, all_symbols.include?(:"What is the sound of one hand clapping?") 
     assert_equal true, all_symbols.include?("What is the sound of one hand clapping?".to_sym) 
    end 

के रूप में है, परीक्षण गुजरता है।

तीन सवाल:

  1. क्यों पहले ज़ोर से पारित करता है? :"nonexistent" को all_symbols में शामिल नहीं किया जाना चाहिए, लेकिन इसे शामिल किया गया है इसलिए मुझे कुछ गलत समझा जाना चाहिए।

  2. जब मैं दूसरे जोर से टिप्पणी करता हूं, तो परीक्षण विफल रहता है क्योंकि "What is the sound of one hand clapping?".to_sym all_symbols में शामिल नहीं है जबकि :"What is the sound of one hand clapping?" शामिल है। चूंकि वे बराबर हैं, आखिरी जोर क्यों विफल रहता है? साथ ही, जब दूसरा दावा टिप्पणी नहीं की जाती है तो यह क्यों गुजरता है? (दूसरे जोर से तीसरे दावे पर कोई प्रभाव क्यों नहीं है?)

  3. मेरे ज्ञान के लिए, इस रूबी कोन का बिंदु यह दर्शाता था कि स्थिरांक प्रतीकों बन जाते हैं (कम से कम, मैं इस विधि से क्या कह रहा हूं नाम)। चूंकि RubyConstant मूल्य "What is the sound of one hand clapping?" के साथ स्थिर है, इसलिए "What is the sound of one hand clapping?".to_sym क्यों प्रतीकों की सूची में शामिल नहीं है? एकमात्र स्पष्टीकरण जिसे मैं सोच सकता हूं वह है कि, विधि के नाम के विपरीत, स्थिरांक वास्तव में प्रतीक बनते नहीं हैं।

आपकी मदद के लिए धन्यवाद!

+0

एक ही सवाल यहाँ से पूछा: http: //stackoverflow.com/questions/13295776/ruby-koans-75-test-constants-become-symbols-correct-answer एलक्यू = 1 – ZenBalance

उत्तर

7

होहा के पास यह सही है लेकिन मैं थोड़ा विस्तार और स्पष्ट करने की कोशिश करूंगा।

दुभाषिया :nonexistent प्रतीक बना देगा जब यह test_constants_become_symbols को पार करता है। फिर, जब आप इसे चलाते हैं, Symbol.all_symbols को सभी ज्ञात प्रतीकों की सूची प्राप्त करने के लिए कहा जाता है और :nonexistent सूची में है। यह भी ध्यान रखें कि "nonexistent" पर डबल कोट्स आंतरिक प्रतिनिधित्व समस्या के बजाय एक वाक्यविन्यास मुद्दा हैं, इसलिए :nonexistent और :"nonexistent" समान हैं।

आप इस एक बाहर टिप्पणी करते हैं:

assert_equal true, all_symbols.include?(:"What is the sound of one hand clapping?") 

तो :"What is the sound of one hand clapping?" प्रतीक पार्सर द्वारा नहीं देखा जाएगा और इसलिए यह all_symbols सरणी में नहीं होगा। test_constants_become_symbols निष्पादित होने पर निम्न पंक्ति पर विधि कॉल निष्पादित की जाती है; हां, तो :"What is the sound of one hand clapping?" प्रतीक के बाद आप अपने all_symbols हो और यह असफल हो जायेगी बनाई गई है:

assert_equal true, all_symbols.include?("What is the sound of one hand clapping?".to_sym) 

आप एक ही दुभाषिया उदाहरण में फिर से test_constants_become_symbols पर अमल करते हैं (दूसरा assert_equal अभी भी बाहर टिप्पणी की) के साथ फिर दोनों uncommented assert_equal कॉल पारित करेंगे test_constants_become_symbols के माध्यम से पहला रन :"What is the sound of one hand clapping?" बनाएगा और दूसरा Symbol.all_symbols इसे लौटाए गए सरणी में शामिल करेगा।

irb में def में लपेटे बिना अपना कोड चलाना आपको यह देखने में सहायता कर सकता है कि क्या हो रहा है।

+0

मेरी जानकारी के लिए, इस के बिंदु रुबी कोन का प्रदर्शन करना था कि स्थिरांक प्रतीकों बन जाते हैं (कम से कम, मैं विधि नाम से यही कह रहा हूं)। चूंकि रुबीकॉन्स्टेंट घोषित किया गया है, क्यों नहीं है "एक हाथ की झुकाव की आवाज़ क्या है?"। To_sym' प्रतीकों की सूची में शामिल है? एकमात्र स्पष्टीकरण जिसे मैं सोच सकता हूं वह है कि, विधि के नाम के विपरीत, स्थिरांक वास्तव में प्रतीक बनते नहीं हैं। कोई विचार? – dskang

+13

यह स्थिरता का मूल्य नहीं है जो प्रतीक बन जाता है। यह निरंतर का नाम है। तो 'Symbol.all_symbols.include? : रूबी कॉन्स्टेंट 'सच होगा। –

+2

निरंतर का _name_ प्रतीक बन जाता है, लेकिन निरंतर _value_ नहीं। इसे आज़माएं: 'चिड़ियाघर = "ज़ी"; पी Symbol.all_symbols.grep (/^जेड /) # => [: ज़ीरोडिविजन त्रुटि, चिड़ियाघर] ' – Phrogz

3

मैं रूबी गुरु नहीं हूं लेकिन ऐसा लगता है कि दुभाषिया ने इस प्रतीक को def अभिव्यक्ति मूल्यांकन के दौरान बनाया है। यही कारण है कि जब आप Symbol.all_symbols पर कॉल करते हैं तो ये प्रतीक पहले से मौजूद हैं। तीसरा assert दूसरी टिप्पणी के साथ विफल रहता है क्योंकि "string".to_sym विधियों निष्पादन के दौरान प्रतीक बनाता है यानी all_symbols = Symbol.all_symbols के साथ प्रतीकों उपलब्ध होने के बाद।

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