2013-02-05 14 views
7

मुझे पता है कि कई रूबी स्टाइल गाइड विधि परिभाषाओं के लिए विधि तर्कों के चारों ओर कोष्ठक पर जोर देते हैं। और मैं समझता हूं कि विधि कॉल के लिए कभी-कभी कोष्ठक की आवश्यकता होती है।रूबी एक विधि परिभाषा में तर्कों के चारों ओर कोष्ठक देता है

लेकिन किसी के उदाहरण के प्रदान कर सकते हैं क्यों रूबी कभी जरूरतों एक विधि परिभाषा के लिए बहस के आसपास कोष्ठकों? असल में, मैं इसके अलावा एक कारण ढूंढ रहा हूं "यह बेहतर दिखता है"।

+2

'def a (b) end' अन्यथा आपको अर्धविराम – MarcDefiant

उत्तर

-2

एक और उदाहरण है जब आप ऐसे

को यह काम नहीं करता के रूप में एक तर्क के रूप में एक हैश पास करना चाहते हैं:

MyTable.update_all { col_a: 1, col_b: 2 } 

क्योंकि {} एक हैश के बजाय एक ब्लॉक के लिए है

माता-पिता जोड़ना काम करता है।

MyTable.update_all({ col_a: 1, col_b: 2 }) 

update_all के मामले में, यह तर्क के रूप में 3 हैश का समय लगता है, तो यह इंगित करने के लिए जो जो हैश में जाने को महत्व देता है महत्वपूर्ण है।

+0

यह भी काम करता है: MyTable.update_all (col_a: 1, col_b: 2) – psparrow

+0

यह डाउनवॉट क्यों किया गया था? क्या यह झूठा है? – BalinKingOfMoria

+0

ओपी ने विधि परिभाषाओं के बारे में पूछा, इसलिए उत्तर ऑफ-विषय है। – johncip

16

यदि आपके पास न तो ब्रांड्स और न ही अर्धविराम as pointed out in this comment था, तो यह संदिग्ध होगा।

def foo a end # => Error because it is amgiguous. 
# Is this a method `foo` that takes no argument with the body `a`, or 
# Is this a method `foo` that takes an argument `a`? 

इसके अलावा जब आप समग्र तर्क का उपयोग करना चाहते हैं, तो आप कोष्ठकों को छोड़ नहीं सकते हैं:

def foo(a, b), c 
    p [a, b, c] 
end 
# => Error 

def foo((a, b), c) 
    p [a, b, c] 
end 
foo([1, 2], 3) # => [1, 2, 3] 
+1

की आवश्यकता होगी यह एक कारण के रूप में पहला कानूनी उत्तर है जिसकी आवश्यकता हो सकती है। मुझे लगता है कि एक लाइन-विधि को स्पष्ट रूप से इसकी आवश्यकता है (मैं उनका कभी भी उपयोग नहीं करता), और एक सरणी लेने और पहले दो तत्वों का उपयोग कुछ ऐसा नहीं है जिसे मैंने कभी नहीं देखा है। मैं इसकी परिभाषा के लिए भी Google नहीं कर सका, फिर भी यह काम करता है! यह कहता है कि पहले दो तत्वों को एक सरणी डालें और ए और बी में डाल दें, या मूल्य को बी में और शून्य में रखें। यह splat के बराबर दर्पण की तरह है। कोई यूआरएल इस से इनकार करता है? – justingordon

0

सबसे आम रूप है जब कोष्ठकों विधि परिभाषा तर्क के आसपास के लिए आवश्यक हैं फार्म के नेस्टेड विधि मंगलाचरण है

foo g x,y 

जो करने के लिए अनुवाद किया जा सकता:

foo(g(x,y)) 

हालांकि कोड को foo(g(x),y) के रूप में व्याख्या किया जा सकता है रूबी एक चेतावनी जारी करता है (* रूबी 1,9 में चेतावनी हटा दी गई है)।

रूबी जारी होने पर एक और मामला यह मामला है जब एक से अधिक तर्क परिभाषित किए जाते हैं।

उत्पन्न होने वाली एक और अस्पष्टता स्थिति वह मामला है जब आप कोष्ठक के साथ विधि का आह्वान करते हैं लेकिन विधि नाम और तर्क के बीच एक स्थान डिलीमीटर के साथ होता है। उदाहरण के लिए

लें:

square (2+2) * 2 # => square (4) * 2 => foo (8) = 64 
square(2+2) * 2 # => square(4) * 2 => 16 * 2= 32 

पूर्ववर्ती एक निम्न उदाहरण लेते का एक परिणाम के रूप में:

puts(square 2, 2) 

यह puts(square(2), 2) या puts(square(2,2)) रूप में व्याख्या की जा सकती है।

निष्कर्ष: बिना किसी ब्रांड्स के तरीकों का आह्वान और परिभाषित करते समय सतर्क रहें।

+0

वह तब होता है जब यह आविष्कार करता है और यह माता-पिता को किसी भी समय रखने के लिए बहुत समझ में आता है, यह संदिग्ध हो सकता है। सवाल परिभाषाओं पर है, न कि हमलावर। लेकिन अच्छा जवाब! – justingordon

+0

प्रश्न विधि आमंत्रण के बारे में नहीं था; वास्तव में, ओपी जोर देता है कि वे इसके बारे में नहीं पूछ रहे हैं। – Divide