2013-02-19 51 views
6

लंबी कहानी छोटी, मैं एक विधि लिख रहा था जिसमें एक विकल्प तर्क शामिल था, जो कुछ सामान करेगा कुंजी के लिए मूल्य: यदि, सही मूल्यांकन किया गया। जब मैं नई सिंटैक्स का उपयोग आईआरबी में हैश की कोशिश कर रहा आईआरबी में एक सिंटैक्स त्रुटि है, शीघ्र रहता खोलें:आईआरबी - रुबी 1.9.एक्स हैश सिंटैक्स: {if: true} के बराबर नहीं है {: if => true}

1.9.3p374 :010 > {if: true} 
1.9.3p374 :011?> 

वर्ष वाक्य रचना का उपयोग करना, काम करता है ठीक:

1.9.3p374 :011 > {:if => true} 
=> {:if=>true} 

सभी कीवर्ड कि एक बयान शुरू करें, वही व्यवहार प्रदर्शित करें। जैसे def, do, module, कि बीच में पाए जाते हैं case

अन्य आरक्षित शब्द और class काम ठीक: else, end

मेरे सवाल यह है: यह अपेक्षित व्यवहार, एक बग या एक सीमा है?

+2

'irb' थोड़ा नाजुक है और इसमें उचित मात्रा में मस्तिष्क क्षति है, आप शायद उनमें से कुछ देख रहे हैं। –

+0

@muistooshort जो बहुत निराधार लगता है। 'echo' रखता है {if: true} .inspect '> test.rb; ruby test.rb' रिटर्न: 'test.rb: 1: वाक्यविन्यास त्रुटि, अप्रत्याशित ':' 'किस फैशन में' irb' नाजुक है? – nzifnab

+2

@nzifnab इरब को 'अंत' तक कथन के निष्पादन पर रोकना है, और यदि यह एक नियंत्रण ऑपरेटर को गलत व्याख्या करता है (जैसा कि यह यहां करता है) इसके लिए अतिरिक्त समस्याएं अनूठी हैं। – coreyward

उत्तर

6

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

आप irb के बाहर, सादे रूबी में कुछ समान व्यवहार देख सकते हैं। उदाहरण के लिए:

puts({if: true}) # no problem, behaves as expected in Ruby 1.9.3. 
puts {if: true} # raises a syntax error in Ruby 1.9.3 

आपके प्रश्न का उत्तर के लिए, यह "अपेक्षित व्यवहार, एक बग या एक सीमा" है, मैं कहेंगे आप irb उपेक्षा और सादे रूबी के साथ उसकी तुलना करना चाहिए, और यदि आप ऐसा करते हैं, तो यह ठीक काम करता है। इसका मतलब है कि इसे irb बग होना चाहिए।

लेकिन क्या यह हल करना संभव या सार्थक है? @coreyward उनकी टिप्पणी में एक अच्छा मुद्दा बनाता है कि irb को अधिकांश मामलों में निष्पादन में देरी होनी चाहिए जब यह if से मुकाबला करता है। आपको निश्चित रूप से जानने के लिए और अधिक देखना होगा, लेकिन आप इस तरह के सभी मामलों की स्पष्ट रूप से व्याख्या करने में सक्षम नहीं हो सकते हैं।

मेरी सलाह: यदि आप कर सकते हैं तो इस निर्माण से पूरी तरह से बचें, और यदि आप इससे बच सकते हैं तो लेबल के लिए आरक्षित शब्दों का उपयोग न करें!

यहां एक फ़ाइल है जिसे आप सादे रूबी (जैसे एमआरआई) के साथ चला सकते हैं। आउटपुट में आपको काम करने की पुष्टि करने के लिए {:if=>true} देखना चाहिए।

{if: true} 
foo = {if: true} 
# if MRI is working, should be able to execute this file without trouble. 
p foo 
+1

यह भी ध्यान देने योग्य है कि यदि आप असाइनमेंट शुरू करते हैं तो सब कुछ अपेक्षित काम करता है। जैसे'foo = {if: true}' एमआरआई में ठीक मूल्यांकन करता है (हालांकि आईआरबी अभी भी यात्रा करता है)। – coreyward

+0

@coreyward: वास्तव में। मैंने कोशिश की मैं स्पष्टीकरण के लिए अपने उत्तर में कोड का एक ब्लॉक जोड़ दूंगा। धन्यवाद! – Peter

+1

सभी बहुत ही रोचक। ओपी का उदाहरण विफल रहता है कि एक रूबी स्क्रिप्ट या आईआरबी में, लेकिन जब आप रखरखाव के चारों ओर कोष्ठक फेंकते हैं तो यह काम करता है। कितना भ्रमित! मैं लगभग इच्छा करता हूं कि वे विशेष रूप से हैश-रॉकेट से फंस गए हैं। समझने के लिए बहुत आसान और बहुत कम गॉथस (और फिर सभी हैंश स्ट्रिंग कुंजियों के साथ हैंश के बजाए हैं, रॉकेट का उपयोग करते हैं! आरक्षित लेबल वाले हैंश रॉकेट का उपयोग करते हैं! प्रतीकों को कभी-कभी लेबल सिंटैक्स का उपयोग करना चाहिए!) उह। – nzifnab