सवाल क्या मुझे रुबी 2.x में पैरामीटर नामित करने की आवश्यकता हो सकती है?


रूबी 2.0 नामित पैरामीटर जोड़ रहा है, इस तरह:

def say(greeting: 'hi')
  puts greeting
end

say                     # => puts 'hi'
say(greeting: 'howdy')  # => puts 'howdy'

मैं डिफ़ॉल्ट मान दिए बिना नामित पैरामीटर का उपयोग कैसे कर सकता हूं, ताकि उन्हें आवश्यक हो?


44
2017-11-06 11:52


मूल




जवाब:


रूबी 2.0.0 में कोई विशिष्ट तरीका नहीं है, लेकिन आप यह रूबी 2.1.0 कर सकते हैं, वाक्यविन्यास के साथ def foo(a:, b:) ...

रूबी 2.0.x में, आप किसी अपवाद को उठाकर किसी भी अभिव्यक्ति को रखकर इसे लागू कर सकते हैं, उदा।

def say(greeting: raise "greeting is required")
  # ...
end

यदि आप इसे बहुत करने की योजना बना रहे हैं (और रूबी 2.1+ का उपयोग नहीं कर सकते हैं), तो आप एक सहायक विधि का उपयोग कर सकते हैं जैसे:

def required
  method = caller_locations(1,1)[0].label
  raise ArgumentError,
    "A required keyword argument was not specified when calling '#{method}'"
end

def say(greeting: required)
  # ...
end

say # => A required keyword argument was not specified when calling 'say'

89
2018-02-25 23:55



बढ़िया, तुमने मुझे यहाँ कुछ सिखाया, धन्यवाद! - Boris Stitnicky
मैंने इसे @ बेन टेटेलबाम के उत्तर के साथ गठबंधन करने का भी प्रयास किया: gist.github.com/rdp/5390849 :) - rogerdpack


वर्तमान पल में (रूबी 2.0.0-preview1) आप निम्न विधि हस्ताक्षर का उपयोग कर सकते हैं:

def say(greeting: greeting_to_say)
  puts greeting
end

greeting_to_say केवल एक प्लेसहोल्डर है जिसका मूल्यांकन नहीं किया जाएगा यदि आप नामित पैरामीटर पर तर्क देते हैं। यदि आप इसे पास नहीं करते हैं (बस कॉलिंग say()), रूबी त्रुटि उठाएगा:

NameError: undefined local variable or method `greeting_to_say' for (your scope)

हालांकि, वह चर कुछ भी बाध्य नहीं है, और जहां तक ​​मैं कह सकता हूं, आपकी विधि के अंदर से संदर्भित नहीं किया जा सकता है। आप अभी भी उपयोग करेंगे greeting स्थानीय चर के रूप में नामित पैरामीटर के लिए क्या पारित किया गया संदर्भ के रूप में।

यदि आप वास्तव में ऐसा करने जा रहे थे, मैं उपयोग करने की सिफारिश करेंगे def say(greeting: greeting) ताकि त्रुटि संदेश उस नाम का संदर्भ देगा जो आप अपने पैरामीटर को दे रहे हैं। मैंने ऊपर दिए गए उदाहरण में केवल अलग-अलग लोगों को चुना है ताकि यह पता लगाया जा सके कि आवश्यक नाम पैरामीटर के लिए तर्क की आपूर्ति न करने के लिए आपको प्राप्त त्रुटि संदेश में रूबी किस प्रकार उपयोग करेगी।

आश्चर्यजनक रूप से, अगर आप कॉल करते हैं say('hi') रूबी उठाएगा ArgumentError: wrong number of arguments (1 for 0) जो मुझे लगता है कि थोड़ा उलझन में है, लेकिन यह केवल पूर्वावलोकन 1 है।


19
2017-11-06 11:58



यह निफ्टी है ... - awendt
अब जब मैं इसे देखता हूं, यह स्पष्ट है। और यह रूबी 2.0 या नामित तर्कों से पूरी तरह से असंबंधित नहीं है, यह "सामान्य" वैकल्पिक तर्कों के साथ ही वैसे ही काम करता है और हमेशा यह है: def m(a = b) end; m # NameError: undefined local variable or method 'b' for main:Object। - Jörg W Mittag
@ JörgWMittag शानदार बिंदु! मैंने यह नहीं सोचा था। - Adam
@ एडम, मुझे आपका जवाब थोड़ा भ्रामक लगता है। इन त्रुटियों को पाने का कारण यह है कि आप तर्क के डिफ़ॉल्ट मान के रूप में मनमानी रूबी कोड प्राप्त कर सकते हैं। यह नियमित स्थितित्मक तर्कों पर भी लागू होता है और इसके पास आवश्यक कीवर्ड तर्कों के साथ कुछ भी नहीं है। डालने की कोशिश करो Time.now एक डिफ़ॉल्ट मान के रूप में और देखें कि क्या होता है। मार्क-आंद्रे का जवाब यहां बिंदु पर अधिक है। - Dimitar
@ डिमिटर मैंने सोचा था कि तंत्र स्पष्ट था, और यह एक लापता फीचर के आसपास एक अच्छा हैक था जो अभी भी एक उपयोगी त्रुटि उत्पन्न करता है। लेकिन मैंने 2.1.0-पूर्वावलोकन 1 रिलीज नोट्स देखा और मार्क-आंद्रे का जवाब वास्तव में आधिकारिक तरीका होगा, इसलिए मैंने स्वीकृत उत्तर बदल दिया है (क्षमा करें, @ एडम)। - Nathan Long


@Awendt और @Adam से समाधान का संयोजन,

def say(greeting: ->{ raise ArgumentError.new("greeting is required") }.call)
  puts greeting
end

आप इसे इस तरह से कुछ भी कर सकते हैं:

def required(arg)
  raise ArgumentError.new("required #{arg}")
end

def say(greeting: required('greeting'))
  puts greeting
end

और @ मार्क-आंद्रे के समाधान के साथ संयोजन: https://gist.github.com/rdp/5390849


11
2017-11-28 19:31



इस सुविधा का समर्थन करने के लिए यह वास्तव में एक अच्छा तरीका है - धन्यवाद! - Nathan Long


कैसा रहेगा:

def say(greeting: nil)
  greeting or raise ArgumentError
  puts greeting
end

say                     # => raises ArgumentError
say(greeting: 'howdy')  # => puts 'howdy'

इसके अलावा, यह मुश्किल होने जा रहा है। इसके अनुसार इस साइट, कीवर्ड तर्क "नामित पैरामीटर हैं जिनके पास डिफ़ॉल्ट मान हैं।"


3
2017-11-06 11:57





रूबी 2.3 में, मैं कर सकता हूं

def say(greeting:)
  puts greeting
end

फिर इसका उपयोग करें ...

say(greeting: "hello there")

1
2017-07-02 18:05