एक डबल * (स्पैट) ऑपरेटर क्या करता है


214

क्या आपने किसी समारोह को इस तरह घोषित किया है?

def foo a, **b
  ...
end

मैं समझता हूं कि सिंगल एक *स्पैट ऑपरेटर है। क्या **मतलब है?

जवाबों:


373

रूबी 2.0 ने कीवर्ड तर्क पेश किए, और **जैसे *कीवर्ड तर्क के लिए कार्य करता है। यह कुंजी / मूल्य जोड़े के साथ एक हैश लौटाता है।

इस कोड के लिए:

def foo(a, *b, **c)
  [a, b, c]
end

यहाँ एक डेमो है:

> foo 10
=> [10, [], {}]
> foo 10, 20, 30
=> [10, [20, 30], {}]
> foo 10, 20, 30, d: 40, e: 50
=> [10, [20, 30], {:d=>40, :e=>50}]
> foo 10, d: 40, e: 50
=> [10, [], {:d=>40, :e=>50}]

44
यह पूरी तरह से सवाल का जवाब देता है, लेकिन मेरे पास एक मामूली परिशिष्ट था। जिस प्रकार आपरेट ऐरे का उपयोग आपके द्वारा पास किए जाने वाले एरे पर किया जा सकता है, उसी तरह डबल स्पैट का उपयोग हैश पर किया जा सकता है। अगर opts = {d: 40, e: 50}है, तो foo 10, opts, f: 60आवंटित करेगा {f: 60}करने के लिए cहै, जबकि foo 10, **opts, f: 60आवंटित करेगा {d: 40, e: 50, f: 60}। दूसरे प्रभाव को प्राप्त करने के लिए, पहले आप mergeस्पष्ट रूप से सरणियों को डी करेंगे ।
ब्रिकम

मुझे लगता है कि यह एक विधि के लिए वैकल्पिक हैश मापदंडों को स्थापित करने के लिए उपयोगी है
बीटपॉटो'

संभवतः ध्यान दें कि यदि कीवर्ड स्प्लिट के साथ कीवर्ड-तर्कों को मिलाया जाता है, तो कीवर्ड स्प्लिट को कीवर्ड के तर्क के बाद आना चाहिए।
Mresees

43

यह डबल स्पैट ऑपरेटर है जो रूबी 2.0 के बाद से उपलब्ध है।

यह सभी कीवर्ड तर्कों को पकड़ लेता है (जो एक साधारण हैश भी हो सकता है, जो रूबी भाषा का हिस्सा बनने से पहले कीवर्ड तर्कों का अनुकरण करने का एक आदर्श तरीका था)

def my_method(**options)
  puts options.inspect
end

my_method(key: "value")

उपरोक्त कोड {key:value}कंसोल पर प्रिंट करता है।

जैसे सिंगल स्पैट ऑपरेटर सभी नियमित तर्कों को कैप्चर करता है, लेकिन एक एरे के बजाय आपको हैश मिलता है ।

वास्तविक जीवन का उदाहरण:

उदाहरण के लिए रेल में cycleविधि इस प्रकार है:

def cycle(first_value, *values)
  options = values.extract_options!
  # ...
end

इस विधि को इस तरह कहा जा सकता है cycle("red", "green", "blue", name: "colors"):।

यह काफी सामान्य पैटर्न है: आप तर्कों की एक सूची को स्वीकार करते हैं और अंतिम एक विकल्प हैश है, जिसे निकाला जा सकता है - उदाहरण के लिए - ActiveSupport का उपयोग करना extract_options!

रूबी 2.0 में आप इन विधियों को सरल बना सकते हैं:

def cycle(first_value, *values, **options)
  # Same code as above without further changes!
end

यदि आप पहले से ही ActiveSupport का उपयोग कर रहे हैं, लेकिन सादे रूबी के लिए कोड काफी लाभ प्राप्त कर रहा है, तो यह केवल एक मामूली सुधार है।


20

इसके अलावा, आप इसे कॉलर साइड में इस तरह से उपयोग कर सकते हैं:

def foo(opts); p opts end
bar = {a:1, b:2}

foo(bar, c: 3)
=> ArgumentError: wrong number of arguments (given 2, expected 1)

foo(**bar, c: 3)
=> {:a=>1, :b=>2, :c=>3}

5
वाह, डबल-स्पैट ES6 के ऑब्जेक्ट स्प्रेड ऑपरेटर के लिए एनालागस है।
मपिसोट

1
धन्यवाद, वह पुष्टि है जिसकी मुझे तलाश थी।
Qortex
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.