2011-05-14 12 views
20

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

इसके बजाय इस बात का

:

foo = 0 
bar = 0 

आप ऐसा कर सकते हैं?

foo = bar = 0 

यह तर्ज पर बचाने के लिए और अभी भी अर्थपूर्ण होने के लिए एक अच्छा तरीका की तरह लगता है। या, क्या यह एक बुरा अभ्यास है? मुझे एहसास है कि मैं थोड़ी सी पठनीयता को त्याग दूंगा। लेकिन, एक छोटी रूबी विधि (< 10 लाइनों) में, यह एक वैध चिंता नहीं हो सकती है।

उत्तर

15

कई भाषाओं में, बाद में एक ही ऑब्जेक्ट को दोनों चरों को असाइन करता है, जो ऑब्जेक्ट म्यूटेबल होने पर परेशानी हो सकती है। ऐसा करने के लिए बेहतर:

foo, bar = 0, 0 
+0

कुछ भाषाओं में सच है, लेकिन सवाल के लिए रुबी में अप्रासंगिक। आईएमओ यह पूरी तरह से ठीक है। – Phrogz

+0

@Phrogz, यह रूबी में ठीक काम करता है। – jasonleonhard

+1

यह ठीक काम करता है, लेकिन अनुशंसित नहीं है, कम पठनीय। https://github.com/bbatsov/ruby-style-guide#parallel-assignment –

1

यह सुरक्षित है और यह काम करता है।

आपके कोडिंग मानक पर पूरी तरह से निर्भर करता है कि इस तरह कुछ ऐसा है या नहीं।

इसका उपयोग करें और समय आने पर बाद में रिफैक्टरिंग के लिए छोड़ दें।

25

एक ही पंक्ति पर दो चर शुरू करने के लिए यह ठीक अभ्यास है जब तक कि मूल्य को छोटा और आसान पालन करने के लिए असाइन किया जा रहा हो। आप सरणी वाक्यविन्यास का उपयोग करके दो अलग-अलग मान भी निर्दिष्ट कर सकते हैं।

foo = bar = 123 
foo #=> 123 
bar #=> 123 

foo, bar = 1, 2 
foo #=> 1 
bar #=> 2 
+1

धन्यवाद! मुझे पसंद है: foo, bar = 1, 2 मैंने उस बारे में सोचा नहीं था। और यह अभी भी पठनीय है। – mrjabba

30

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

ruby-1.9.2-p180 :001 > foo = bar = "string" 
=> "string" 
ruby-1.9.2-p180 :002 > foo.upcase! 
=> "STRING" 
ruby-1.9.2-p180 :003 > bar 
=> "STRING" 
7

यह अजीब है।

इग्नेसियो वेज़क्वेज़-अब्राम जवाब के साथ विभिन्न मूल्यों के साथ चर आरंभ के लिए सच है:
a, b = 123, 456

लेकिन, मुझे लगता है कि आपकी चिंता निम्न कार्य पर है:
a = b = "hello"

लेकिन प्रतीक्षा! उपरोक्त पंक्ति चर के लिए समान स्मृति पता आवंटित करती है a और b यानी
a.object_id और b.object_id बराबर हैं। तो a पर कोई भी बदलाव b पर जारी रहेगा।

मुझे यह पसंद नहीं है, लेकिन एक कामकाज हो सकता है।
x = "a very long string or something you don't want to type multiple times"
a, b, c = x.clone, x.clone, x.clone

ओह मैं ऐसा करने का एक सुंदर तरीका नहीं था चाहते हैं।

+0

यह मेरे लिए बहुत सुंदर लग रहा है ... –

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