जवाबों:
रूबी 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}]
यह डबल स्पैट ऑपरेटर है जो रूबी 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 का उपयोग कर रहे हैं, लेकिन सादे रूबी के लिए कोड काफी लाभ प्राप्त कर रहा है, तो यह केवल एक मामूली सुधार है।
इसके अलावा, आप इसे कॉलर साइड में इस तरह से उपयोग कर सकते हैं:
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}
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
स्पष्ट रूप से सरणियों को डी करेंगे ।