2017-01-31 7 views
5

मैं इस समय रूबी सीख रहा हूं और मैं इस असाधारण स्थिति में आया हूं।* पैरामीटर पैरामीटर के रूप में * (तारांकन) ऑपरेटर का उपयोग करते समय मुझे "अप्रत्याशित *" त्रुटि क्यों मिल रही है?

जब मैं निम्नलिखित कोड चलाता हूं, तो मुझे नीचे दिखाया गया आउटपुट मिलता है।

कार्य कोड:

def hello(a,b=1,*c,d,e,f) 
    p a,b,c,d,e,f 
end 

hello(1,2,3,4,5) 

कार्य संहिता आउटपुट:

1 
2 
[] 
3 
4 
5 

हालांकि, कोड संपादन ताकि पैरामीटर 'ई' पकड़ सभी पैरामीटर है, मैं पर नीचे नीचे दिखाया गया त्रुटि।

असफल कोड:

def hello(a,b=1,c,d,*e,f) 
    p a,b,c,d,e,f 
end 

hello(1,2,3,4,5) 

असफल कोड आउटपुट:

a.rb:1: syntax error, unexpected * 
def hello(a,b=1,c,d,*e,f) 
        ^
a.rb:1: syntax error, unexpected ')', expecting '=' 
a.rb:3: syntax error, unexpected keyword_end, expecting end-of-input 

मैं Ubuntu पर गहरे लाल रंग का 2.3.1p112 (2016/04/26 संशोधन 54768) का उपयोग कर रहा हूँ।

मुझे यह जानने में दिलचस्पी है कि कोड का दूसरा स्निपेट क्यों विफल रहता है।

संपादित करें:

निम्नलिखित कोड के साथ-साथ विफल रहता है।

def hello(a,b=1,c,d,e,*f) 
    p a,b,c,d,e,f 
end 

hello(1,2,3,4,5) 

और मैं एक ऐसी ही त्रुटि

a.rb:1: syntax error, unexpected * 
def hello(a,b=1,c,d,e,*f) 
        ^
a.rb:3: syntax error, unexpected keyword_end, expecting end-of-input 
+2

अंत में एक स्प्लट ऑपरेटर का उपयोग करना मेरे लिए समझ में नहीं आता है। – fl00r

+0

सच है। यह पठनीय नहीं है, लेकिन इसे पार्स करना संभव है, और रुबी कुछ मामलों में करता है। –

+0

@ fl00r मैंने निम्नलिखित विधि परिभाषा की कोशिश की और मुझे एक ही त्रुटि मिल गई। डीफ़ हैलो (ए, बी = 1, सी, डी, ई, * एफ) – Steve

उत्तर

5

प्रासंगिक दस्तावेज here है और यहाँ एक संबंधित question है मिलता है। हालांकि वे सभी मामलों को कवर नहीं करते हैं।

यहाँ मैं क्या इकट्ठा कर सकते हैं:

  • कोई एक से अधिक सूचक ऑपरेटर (*args) का इस्तेमाल किया जा सकता है।
  • एकाधिक डिफ़ॉल्ट तर्कों का उपयोग किया जा सकता है (a=1, b=2)।
  • डिफ़ॉल्ट तर्क स्प्लट ऑपरेटर के बाईं ओर होना चाहिए।
  • एकाधिक डिफ़ॉल्ट तर्क सीधे एक के बाद आते हैं।
  • यदि डिफ़ॉल्ट तर्क और स्प्लट ऑपरेटर का उपयोग किया जाता है, तो डिफ़ॉल्ट तर्क स्प्लट ऑपरेटर से ठीक पहले आते हैं।
  • यदि उपरोक्त नियमों का पालन किया जाता है, तो डिफ़ॉल्ट तर्क और स्प्लट ऑपरेटर तर्क सूची में कहीं भी हो सकता है।

    • बीच

    यहाँ में पिछले तर्क के रूप में सूचक ऑपरेटर डाल

  • से बचने डाल डिफ़ॉल्ट तर्क मान्य हैं:

पठनीयता के लिए, यह एक अच्छा विचार हो सकता है विधि परिभाषाएं:

def hello(a = 1, b)   ;end 
def hello(a, b = 2)   ;end 
def hello(a = 1, b = 2)  ;end 
def hello(a = 1, b = 2, c)  ;end 
def hello(a, b = 2, c = 3)  ;end 
def hello(a, b = 2, *c)  ;end 
def hello(a, b = 2, *c, d)  ;end 
def hello(a = 1, b = 2, *c, d) ;end 

अपने दूसरे उदाहरण के लिए, इस वाक्य ठीक होगा:

def hello(a,b,c,d=1,*e,f) 
    p a,b,c,d,e,f 
end 

ब्लॉक और कीवर्ड तर्क के साथ एक अधिक पूर्ण उदाहरण के लिए, @ JörgWMittag उत्तम answer देखते हैं।

+0

धन्यवाद एरिक। वह मेरी समझ भी थी। मैं बहुत परेशान हूं कि दूसरा मामला मेरे लिए काम नहीं करता है। – Steve

+0

@Steve आपके दूसरे उदाहरण में, बिल्कुल 5 तर्क पारित करते समय, यह स्पष्ट नहीं है कि 'बी' को' 1' या आपका दूसरा तर्क के रूप में पारित किया जाना चाहिए या नहीं। इन अस्पष्टताओं से बचने के लिए, रूबी इन कठोर नियमों को लागू करता है। –

+0

धन्यवाद @ होल्डर जस्ट। मेरा कोड एरिक का उल्लेख किया गया निम्नलिखित नियम विफल रहता है। ** यदि डिफ़ॉल्ट तर्क और स्प्लट ऑपरेटर का उपयोग किया जाता है, तो डिफ़ॉल्ट तर्क स्प्लट ऑपरेटर से ठीक पहले आना चाहिए। ** यदि मैं इस नियम का पालन करता हूं, तो कोड ठीक काम करता है। – Steve

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

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