2009-05-27 9 views
140

रूबी कोडइस रूबी कोड में (यूनरी) * ऑपरेटर क्या करता है? यह क्या कर रहा है और जहां इस के लिए दस्तावेज़ है -

line = "first_name=mickey;last_name=mouse;country=usa" 
record = Hash[*line.split(/=|;/)] 

मैं अलग * ऑपरेटर से दूसरी पंक्ति में सब कुछ समझ को देखते हुए? (जैसा कि आप अनुमान लगा सकते हैं, इस मामले की खोज कठिन साबित हो रही है ...)

उत्तर

217

*splat ऑपरेटर है।

यह तर्कों की एक सूची में Array फैलाता है, इस मामले में Hash.[] विधि के लिए तर्कों की एक सूची। (। अधिक सटीक होना, यह किसी भी वस्तु है कि to_ary/to_a, या to_a रूबी 1.9 में का जवाब फैलता)

उदाहरण देकर स्पष्ट करने के लिए निम्न दो बयानों के बराबर हैं:

method arg1, arg2, arg3 
method *[arg1, arg2, arg3] 

यह भी इस्तेमाल किया जा सकता एक विधि संदर्भ में सभी शेष विधि तर्कों को पकड़ने के लिए, एक अलग संदर्भ में। उस मामले में, यह विस्तार नहीं है, लेकिन गठबंधन:

def method2(*args) # args will hold Array of all arguments 
end 

Some more detailed information here

+33

सामान्य रूप से, जब एलएचएस जैसी स्थिति में उपयोग किया जाता है (जब भी आप इसे किसी मूल्य पर आक्रमण कर रहे होते हैं), स्प्लट एक सरणी को अलग-अलग मानों में विभाजित करता है, और जब आरएचएस जैसी स्थिति में उपयोग किया जाता है (किसी भी समय आप ' कुछ पूर्व अपरिभाषित चरों पर इसका उपयोग कर रहे हैं), यह अलग-अलग मानों को सरणी में समूहित करता है। तो 'ए, बी, * सी = डी, ई, एफ, * जी 'एक = डी, बी = ई, और सी = [एफ, जी 0, जी 1, जी 2, ..., जीएन] सेट करता है, जहां जी = [ g0, g1, g2, ..., gn] – rampion

+0

महान उत्तर, स्पष्ट और विस्तृत, धन्यवाद –

+2

बस पूर्णता के लिए, स्प्लट ऑपरेटर डेविड द्वारा 'द वेल्ड ग्राउंडेड रूबीस्ट' में उपयोग की जाने वाली शब्दावली के अनुसार एक सरणी सूची में बदल जाता है ए ब्लैक –

34

स्प्लट ऑपरेटर एक फ़ंक्शन को पारित एक सरणी को अनपैक करता है ताकि प्रत्येक तत्व को फ़ंक्शन पर व्यक्तिगत पैरामीटर के रूप में भेजा जा सके।

एक साधारण उदाहरण:

>> def func(a, b, c) 
>> puts a, b, c 
>> end 
=> nil 

>> func(1, 2, 3) #we can call func with three parameters 
1 
2 
3 
=> nil 

>> list = [1, 2, 3] 
=> [1, 2, 3] 

>> func(list) #We CAN'T call func with an array, even though it has three objects 
ArgumentError: wrong number of arguments (1 for 3) 
    from (irb):12:in 'func' 
    from (irb):12 

>> func(*list) #But we CAN call func with an unpacked array. 
1 
2 
3 
=> nil 

यह है कि!

4

जैसा कि सभी का उल्लेख है, यह एक "splat" है। रूबी सिंटैक्स की तलाश करना असंभव है, और मैंने इसे अन्य प्रश्नों में पूछा है। प्रश्न के उस हिस्से का जवाब यह है कि आप

asterisk in ruby syntax 

पर Google पर खोज करते हैं। Google आपके लिए है, बस शब्दों में जो कुछ आप देखते हैं उसे डाल दें।

Anyhoo, बहुत सारे रूबी कोड की तरह, वह कोड काफी घना है।

line.split(/=|;/) 

छह तत्वों, first_name, mickey, last_name, mouse, country, usa की एक सरणी में आता है। फिर स्प्लट का उपयोग इसे हैश में बनाने के लिए किया जाता है। अब रूबी लोग आपको स्प्लट विधि को देखने के लिए हमेशा भेजते हैं, क्योंकि सब कुछ रूबी में उजागर होता है। मुझे नहीं पता कि यह कहां है, लेकिन एक बार आपके पास यह देखने के बाद, आप देखेंगे कि यह for सरणी के माध्यम से चलाता है और हैश बनाता है।

आप core दस्तावेज़ीकरण में कोड की तलाश करेंगे। आप इसे नहीं ढूँढ सकते हैं (मैं नहीं कर सकता), तो आप इस तरह कुछ कोड लिखने की कोशिश करेंगे (जो काम करता है, लेकिन रूबी की तरह कोड नहीं है):

line = "first_name=mickey;last_name=mouse;country=usa" 
presplat = line.split(/=|;/) 
splat = Hash.new 
for i in (0..presplat.length-1) 
    splat[presplat[i]] = presplat[i+1] if i%2==0 
end 

puts splat["first_name"] 

और उसके बाद रूबी गिरोह बताने के लिए सक्षम हो जाएगा आप क्यों अपना कोड मूर्ख, बुरा, या सिर्फ सादा गलत है।

यदि आपने इसे अभी तक पढ़ा है, तो Hash दस्तावेज़ीकरण के माध्यम से पढ़ लें, जो विभाजन को समझाता नहीं है लेकिन आपको इसे जानने की आवश्यकता है।

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