Computer >> कंप्यूटर >  >> प्रोग्रामिंग >> Ruby

कीवर्ड तर्क, हैश और स्प्लैट के साथ मज़ा

आपने शायद इस पैटर्न को पहले देखा होगा। एक विधि में एक 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}"
end

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

लेकिन यदि आपने रूबी 2.0+ में कीवर्ड तर्कों का उपयोग करने के लिए इस पद्धति को बदल दिया है, तो आपको :first_name खींचने की आवश्यकता नहीं होगी और :last_name आपके हैश से बाहर. रूबी आपके लिए करती है:

def hello_message(first_name:, last_name:)
  "Hello, #{first_name} #{last_name}"
end

इससे भी बेहतर, यदि आपका ऐप रूबी 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")

देखना? वे तर्क समान हैं!

कीवर्ड तर्क सिंटैक्स को एक कदम बहुत दूर धकेलना

क्या होगा यदि आपने नहीं हालांकि, नए हैश सिंटैक्स पर स्विच किया गया है? आप अपना सारा कोड बदल सकते हैं। लेकिन, कम से कम रूबी 2.2.1 में, पुराना हैश सिंटैक्स कीवर्ड तर्कों के साथ ठीक काम करता है:

irb(main):007:0> hello_message_with_keyword_arguments(:first_name => "Justin", :last_name => "Weiss")
=> "Hello, Justin Weiss"

अच्छा! हैश ऑब्जेक्ट पास करने के बारे में क्या , तर्कों के बजाय?

irb(main):008:0> options = {:first_name => "Justin", :last_name => "Weiss"}
irb(main):009:0> hello_message_with_keyword_arguments(options)
=> "Hello, Justin Weiss"

वाह। क्या होगा अगर हम मिश्रण . करना चाहते हैं एक हैश और कीवर्ड तर्क?

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

ठीक है। मुझे लगता है कि हमने वह एक कदम बहुत दूर ले लिया है। इसे ठीक करने के लिए, आप एक हैश बनाने के लिए हैश # मर्ज का उपयोग कर सकते हैं जिसे आप स्वयं ही पास कर सकते हैं। लेकिन एक बेहतर तरीका है।

यदि आप कीवर्ड तर्कों के बजाय नियमित तर्कों का उपयोग कर रहे थे, तो आप * का उपयोग करके किसी सरणी से तर्कों को विभाजित कर सकते हैं :

def generate_thumbnail(name, width, height)
  # ...
end

dimensions = [240, 320]
generate_thumbnail("headshot.jpg", *dimensions)

लेकिन क्या कीवर्ड को विभाजित करने का कोई तरीका है तर्क सूची में तर्क?

यह पता चला है:** . यहां बताया गया है कि आप उस टूटे हुए उदाहरण को ** . के साथ कैसे ठीक करेंगे :

irb(main):010:0> options = {last_name: "Weiss"}
irb(main):011:0> hello_message_with_keyword_arguments(first_name: "Justin", **options)
=> "Hello, Justin Weiss"

और अगर आप वास्तव में . हैं पागल, आप नियमित तर्क, खोजशब्द तर्क, और विभाजन को मिला सकते हैं:

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

बेशक, अगर आप अपने आप को उस स्थिति में पाते हैं जहाँ यह आवश्यक है, तो आपने शायद बहुत पहले एक गलती की है!

कीवर्ड तर्कों को आसान तरीके से कैप्चर करें

क्या आप जानते हैं कि आप * . का उपयोग करके अपने सभी मेथड तर्कों को एक सरणी में कैसे बदल सकते हैं? ?

def argument_capturing_method(*args)
  args
end

argument_capturing_method(1, 2, 3) # => [1, 2, 3]

यह कीवर्ड तर्कों के साथ भी काम करता है। वे हैश में बदल गए हैं, और आपके args . के अंतिम तर्क के रूप में दिखाई देते हैं सरणी:

argument_capturing_method(1, 2, 3, key: "value") # => [1, 2, 3, {:key=>"value"}]

लेकिन 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"}}

इस सिंटैक्स के साथ, आप args[0] . के साथ पहले नियमित तर्क तक पहुंच सकते हैं और :key keyword_args[:key] . के साथ कीवर्ड तर्क ।

... बेशक, अब हम विकल्प हैश पर वापस आ गए हैं।

आपके कोड से एक टन पैरामीटर निष्कर्षण बॉयलरप्लेट को हटाने के लिए कीवर्ड तर्क बहुत अच्छे हैं। और हो सकता है कि उनका लाभ उठाने के लिए आपको अपना कोई कोड बदलना भी न पड़े।

लेकिन जब आप अधिक सामान्य तरीके लिखते हैं, तो कुछ नई तकनीकें होती हैं जिन्हें आपको कीवर्ड तर्कों को अच्छी तरह से संभालना सीखना होगा। आपको उन तकनीकों का बहुत बार उपयोग नहीं करना पड़ सकता है। लेकिन जब आप ऐसा करेंगे, तो यह शक्ति और लचीलापन आपकी प्रतीक्षा में रहेगा।


  1. बायबग, रेल और पाउ ​​के साथ रिमोट डिबगिंग

    यदि आपने पहले बायबग नहीं देखा है, तो मेरा सुझाव है कि आप इसे देखें। रूबी 2.x के लिए यह एक अच्छा डीबगर है। इसके लेखकों के शब्दों में: Byebug रूबी 2 के लिए उपयोग करने के लिए एक आसान, सुविधा संपन्न डिबगर है। यह निष्पादन नियंत्रण के लिए नए TracePoint API और कॉल स्टैक नेविगेशन के लिए नए डीबग इंस्पेक्टर A

  1. लॉगर और लॉगरेज के साथ रूबी में लॉगिंग

    रूबी में लॉग के साथ कार्य करना लॉगिंग उन प्राथमिक कार्यों में से एक है जिसे एक एप्लिकेशन आमतौर पर संबोधित करता है। लॉग का उपयोग तब किया जाता है जब आपको आवश्यकता होती है, उदाहरण के लिए, देखें कि आपके ऐप्स के अंदर क्या हो रहा है, उन पर नज़र रखें, या कुछ विशिष्ट डेटा के लिए मीट्रिक एकत्र करें। एक न

  1. Vue, Vuex और Rails के साथ एक पूर्ण-स्टैक एप्लिकेशन का निर्माण

    स्केलेबिलिटी को ध्यान में रखते हुए फुल-स्टैक एप्लिकेशन बनाना डराने वाला हो सकता है, खासकर जब Vue और Vuex के नवीनतम संस्करण के साथ निर्माण किया जाता है, जिसमें पूर्ण टाइपस्क्रिप्ट समर्थन होता है। यह लेख अपने पाठकों को वह सब कुछ सिखाएगा जो उन्हें राज्य प्रबंधन से Vuex 4.0 के साथ स्केलेबल फुल-स्टैक एप्