आपने शायद इस पैटर्न को पहले देखा है। एक मेथड के पास अपने अंतिम आर्गुमेंट के रूप में एक options हैश होता है, जिसमें अतिरिक्त पैरामीटर होते हैं:
def hello_message(name_parts = {}) first_name = name_parts.fetch(:first_name) last_name = name_parts.fetch(:last_name) "Hello, #{first_name} #{last_name}" endpre>दुर्भाग्य से, आपको उन पैरामीटर्स को हैश से निकालना होगा। और इसका मतलब है कि अच्छे हिस्से तक पहुंचने से पहले बहुत सारा सेटअप करना पड़ता है।
लेकिन अगर आप इस मेथड को Ruby 2.0+ में कीवर्ड आर्गुमेंट का उपयोग करने के लिए बदलते हैं, तो आपको
:first_nameऔर:last_nameको अपने हैश से निकालने की आवश्यकता नहीं होगी। रूबी आपके लिए यह करता है:def hello_message(first_name:, last_name:) "Hello, #{first_name} #{last_name}" endpre>यहां तक कि बेहतर, यदि आपका ऐप Ruby 1.9+ हैश सिंटैक्स का उपयोग करता है, तो आपके मेथड उन मेथड्स के कॉलर्स को बदले बिना कीवर्ड आर्गुमेंट का उपयोग कर सकते हैं:
def hello_message_with_an_options_hash(name_parts = {}) first_name = name_parts.fetch(:first_name) last_name = name_parts.fetch(:last_name) "Hello, #{first_name} #{last_name}" end def hello_message_with_keyword_arguments(first_name:, last_name:) "Hello, #{first_name} #{last_name}" end hello_message_with_an_options_hash(first_name: "Justin", last_name: "Weiss") hello_message_with_keyword_arguments(first_name: "Justin", last_name: "Weiss")pre>देखें? वे आर्गुमेंट्स समान हैं!
कीवर्ड आर्गुमेंट सिंटैक्स को एक कदम बहुत दूर धकेलना
क्या होगा यदि आपने नहीं नई हैश सिंटैक्स पर स्विच किया है, हालांकि? आप अपने सभी कोड को परिवर्तित कर सकते हैं। लेकिन, कम से कम Ruby 2.2.1 में, पुरानी हैश सिंटैक्स कीवर्ड आर्गुमेंट के साथ ठीक काम करती है:
irb(main):007:0> hello_message_with_keyword_arguments(:first_name => "Justin", :last_name => "Weiss") => "Hello, Justin Weiss"pre>अच्छा! हैश ऑब्जेक्ट पास करने के बारे में क्या, आर्गुमेंट्स के बजाय?
irb(main):008:0> options = {:first_name => "Justin", :last_name => "Weiss"} irb(main):009:0> hello_message_with_keyword_arguments(options) => "Hello, Justin Weiss"pre>वाह। क्या होगा अगर हम एक हैश और कीवर्ड आर्गुमेंट्स को मिलाना चाहते हैं?
irb(main):010:0> options = {last_name: "Weiss"} irb(main):011:0> hello_message_with_keyword_arguments(first_name: "Justin", options) SyntaxError: (irb):11: syntax error, unexpected ')', expecting => from /usr/local/bin/irb:11:in `<main>'pre>ठीक है। मुझे लगता है कि हमने इसे एक कदम बहुत दूर ले लिया। इसे ठीक करने के लिए, आप एक हैश बनाने के लिए Hash#merge का उपयोग कर सकते हैं जिसे आप अपने आप पास कर सकें। लेकिन एक बेहतर तरीका है।
यदि आप कीवर्ड आर्गुमेंट्स के बजाय नियमित आर्गुमेंट्स का उपयोग कर रहे थे, तो आप
*का उपयोग करके एक सरणी से आर्गुमेंट्स को स्प्लैट कर सकते थे:def generate_thumbnail(name, width, height) # ... end dimensions = [240, 320] generate_thumbnail("headshot.jpg", *dimensions)pre>लेकिन क्या कीवर्ड आर्गुमेंट्स को एक आर्गुमेंट सूची में स्प्लैट करने का कोई तरीका है?
पता चला कि है:
**। यहां बताया गया है कि आप उस टूटे हुए उदाहरण को**के साथ कैसे ठीक करेंगे:irb(main):010:0> options = {last_name: "Weiss"} irb(main):011:0> hello_message_with_keyword_arguments(first_name: "Justin", **options) => "Hello, Justin Weiss"pre>और अगर आप वास्तव में पागल हैं, तो आप नियमित आर्गुमेंट्स, कीवर्ड आर्गुमेंट्स, और स्प्लैट्स को मिला सकते हैं:
def hello_message(greeting, time_of_day, first_name:, last_name:) "#{greeting} #{time_of_day}, #{first_name} #{last_name}!" end args = ["Morning"] keyword_args = {last_name: "Weiss"} hello_message("Good", *args, first_name: "Justin", **keyword_args) # => "Good Morning, Justin Weiss!"pre>बेशक, यदि आप खुद को उस स्थिति में पाते हैं जहां यह आवश्यक है, तो आपने शायद बहुत पहले गलती की थी!
कीवर्ड आर्गुमेंट्स को आसान तरीके से कैप्चर करें
क्या आप जानते हैं कि आप
*का उपयोग करके अपने सभी मेथड आर्गुमेंट्स को एक सरणी में कैसे बदल सकते हैं?def argument_capturing_method(*args) args end argument_capturing_method(1, 2, 3) # => [1, 2, 3]pre>यह कीवर्ड आर्गुमेंट्स के साथ भी काम करता है। वे एक हैश में परिवर्तित हो जाते हैं, और आपके
argsसरणी के अंतिम आर्गुमेंट के रूप में दिखाई देते हैं:argument_capturing_method(1, 2, 3, key: "value") # => [1, 2, 3, {:key=>"value"}]pre>लेकिन
args.last[:key]इस तरह से पकड़े गए कीवर्ड आर्गुमेंट्स को पढ़ने का सबसे अच्छा तरीका नहीं है। इसके बजाय, आप नए**सिंटैक्स का उपयोग करके कीवर्ड आर्गुमेंट्स को स्वयं प्राप्त कर सकते हैं:def dual_argument_capturing_method(*args, **keyword_args) {args: args, keyword_args: keyword_args} end dual_argument_capturing_method(1, 2, 3, key: "value") # => {:args=>[1, 2, 3], :keyword_args=>{:key=>"value"}}pre>इस सिंटैक्स के साथ, आप पहले नियमित आर्गुमेंट को
args[0]के साथ और:keyकीवर्ड आर्गुमेंट कोkeyword_args[:key]के साथ एक्सेस कर सकते हैं।... बेशक, अब हम वापस ऑप्शन हैश पर हैं।
कीवर्ड आर्गुमेंट्स आपके कोड से पैरामीटर निष्कर्षण बॉयलरप्लेट के एक टन को हटाने के लिए महान हैं। और हो सकता है कि आपको उनका लाभ उठाने के लिए अपने किसी भी कोड को बदलने की आवश्यकता न हो।
लेकिन जब आप अधिक सामान्य मेथड लिखते हैं, तो कुछ नई तकनीकें हैं जिन्हें आपको कीवर्ड आर्गुमेंट्स को अच्छी तरह से संभालने के लिए सीखना होगा। आपको उन तकनीकों का बहुत बार उपयोग नहीं करना पड़ सकता है। लेकिन जब आप करते हैं, तो यह शक्ति और लचीलापन वहां होगा, आपका इंतजार कर रहा होगा।