2012-11-21 32 views
10

मैं रुबी 1.9 चला रहा हूं।"या" ऑपरेटर पिछली लाइन के अंत में रखा जाना चाहिए? (अप्रत्याशित tOROP)

यह एक वैध वाक्य रचना है:

items = (data['DELETE'] || data['delete'] || 
     data['GET'] || data['get'] || data['POST'] || data['post']) 

लेकिन यह मुझे एक त्रुटि देता है:

items = (data['DELETE'] || data['delete'] 
     || data['GET'] || data['get'] || data['POST'] || data['post']) 

t.rb:8: syntax error, unexpected tOROP, expecting ')' 
     || data['GET'] || data['get'] |... 
     ^

क्यों ?!

उत्तर

8

काम करेंगे क्या मैं कह सकता हूँ है "कि यह सिर्फ कैसे काम करता है"।

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

जैसा कि आप जानते हैं, रूबी उसमें विशेष है, लगभग हमेशा, यह सिर्फ इसे समझता है।

इस मामले में, हालांकि, एक संघर्ष है। पार्सर जानता है कि आपकी अभिव्यक्ति समाप्त नहीं हुई है, क्योंकि यह अभी भी ) की तलाश में है, लेकिन यह एक यौगिक अभिव्यक्ति हो सकती है।

उदाहरण के लिए, आप कुछ इस तरह लेखन किया जा सकता है:

(p :a; p :b; p :c) 

... लेकिन ; के बजाय न्यू लाइन नरम टर्मिनेटर का उपयोग कर ... नीचे इस वाक्य रचना वास्तव में काम करता है:

(p :a 
p :b 
p :c) 

(बीटीडब्ल्यू, उस अभिव्यक्ति का मूल्य अनुक्रम में अंतिम अभिव्यक्ति का मूल्य है।)

रूबी आपके कथन और उपरोक्त दोनों को पार्स नहीं कर सकता एक बेहतर संकेत जैसे एक बाइनरी ऑपरेटर जो स्पष्ट रूप से एक और लाइन की आवश्यकता है।

+0

मुझे यकीन नहीं है कि "अद्भुत नौकरी" सही है (मैं तर्क दूंगा कि यह * विषम * अभिव्यक्ति के रूप में * एक ऑपरेटर द्वारा निम्न पंक्ति पर जारी रखा जा सकता है), * लेकिन * यह यह है कि कैसे रूबी भाषा (मौसा और सभी) परिभाषित किया गया है तो +1। (जावास्क्रिप्ट एएसआई के लिए कुछ प्रतिबंधित प्रस्तुतियों के साथ - और शायद अधिक "अपेक्षित" - –

+1

असल में: स्कैला और पायथन - जो अर्ध-कॉलन की आवश्यकता नहीं है - * भी * इसे अलग-अलग संभालें, और शायद "अपेक्षित" रूबी की तुलना में। वे उत्तर के लिए तर्क दिए गए बाद के फॉर्म का समर्थन नहीं करते हैं (ब्रांडेसिस और कोई कथन विभाजक नहीं) हालांकि, जो एक अजीब-आश निर्माण है)। –

4

रूबी कथन के अंत के रूप में लाइन के अंत की व्याख्या करता है। ऑपरेटर एक बयान जारी रखने का संकेत देते हैं।

आप निरंतरता का संकेत करने के रूप में अच्छी तरह बैकस्लैश \ इस्तेमाल कर सकते हैं तो निम्नलिखित

items = (data['DELETE'] || data['delete'] \ 
    || data['GET'] || data['get'] || data['POST'] || data['post']) 
2

चूंकि रूबी रेखा-उन्मुख है, इसलिए ऑपरेटर के साथ समाप्त होने वाले बयान अपूर्ण के रूप में व्याख्या किए जाते हैं। ऑपरेटर के बाद बैकस्लैश जोड़ना बहु-पंक्ति कथन को सही तरीके से व्याख्या करने की अनुमति देगा। (स्रोत: http://phrogz.net/ProgrammingRuby/language.html)