इस रूबी कोड में ऑपरेटर (यूनरी) * ऑपरेटर क्या करता है?


174

रूबी कोड दिया

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

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

जवाबों:


271

*है सूचक ऑपरेटर।

यह 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

कुछ और विस्तृत जानकारी यहाँ


36
सामान्य तौर पर, जब एलएचएस जैसी स्थिति में उपयोग किया जाता है (किसी भी समय आप इसे मूल्य पर लागू कर रहे हैं), अलग-अलग मूल्यों में एक ऐरे को अलग करता है, और जब आरएचएस जैसी स्थिति में उपयोग किया जाता है (किसी भी समय आप इसका उपयोग कर रहे हैं कुछ पहले अपरिभाषित चर पर), यह एक सरणी में अलग-अलग मानों को समूहित करता है। इसलिए a,b,*c = d,e,f,*ga = d, b = e, और c = [f, g0, g1, g2, ..., gn], जहाँ g = [g0, g1, g2, ..., gn]
rampion

2
पूर्णता के लिए, स्पैट ऑपरेटर डेविड ए। ब्लैक
डेविड बुरो

12
@ क्रैम्पियन: अद्भुत टिप्पणी, आपने अभी-अभी LHS और RHS को मिलाया है। यह दूसरा रास्ता है।
थॉमस जूल 17'09

46

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

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

>> 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

बस!


6

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

asterisk in ruby syntax

Google में Google आपके लिए है, बस वही देखें जो आप शब्दों में देखते हैं।

किसी भी तरह, बहुत सारे रूबी कोड की तरह, यह कोड काफी घना है।

line.split(/=|;/)

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

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

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["a", 100, "b", 200] #=> {"a"=>100, "b"=>200}

तो आपके उदाहरण में यह निम्नलिखित हैश की ओर ले जाएगा:

{"first_name"=>"mickey", "last_name"=>"mouse", "county"=>"usa"}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.