2009-06-10 11 views
7

में पैरामीटर के रूप चूक मूल्यों के साथ एक विकल्प हैश का उपयोग करने चलो कहते हैं कि मैं एक तरीका है जिसके इस तरह बुलाया जाएगा चाहते हैं एक अच्छा साफ तरीका है:क्या माणिक

tiger = create_tiger(:num_stripes => 12, :max_speed => 43.2) 
tiger.num_stripes # will be 12 

जहां विकल्पों में से कुछ मूलभूत मूल्यों है:

tiger = create_tiger(:max_speed => 43.2) 
tiger.num_stripes # will have some default value 

क्या लागू करने का एक अच्छा मुहावरेदार गहरे लाल रंग का तरीका है कि विधि कार्यान्वयन में व्यवहार दोषी?

उत्तर

16

आप रेल (न सिर्फ सादा रूबी) का उपयोग कर रहे हैं, एक से थोड़ा कम विधि है

def foo(options = {}) 
    options.reverse_merge! { ... defaults ... } 
end 

यह आपको एक बालक थोड़ा और अधिक सफाई से कई पंक्तियों करने की अनुमति का जोड़ा लाभ है:

def foo(options = {}) 
    options.reverse_merge!(
    :some_default => true, 
    :other_default => 5 
) 
end 
+1

बस जो मैं खोज रहा था, धन्यवाद। मैंने यह भी पाया कि यदि आप रेल का उपयोग नहीं कर रहे हैं तो Facets मणि भी बंदर पैच हैश एक रिवर्स_मेर के साथ! तरीका। –

+1

ध्यान दें कि इस विधि को पाने के लिए आपको सभी रेलों का उपयोग करने की आवश्यकता नहीं है (हालांकि यह जवाब तब तक सही नहीं हो सकता था जब यह उत्तर मूल रूप से 200 9 में पोस्ट किया गया था)। आपको केवल 'activesupport' मणि (जिसे रेल के हिस्से के रूप में बंडल किया गया है) का उपयोग करने की आवश्यकता है, फिर सुनिश्चित करें कि आपने' आवश्यकता 'सक्रिय_support/core_ext/हैश/रिवर्स_मेरगे "' कहा है। – GMA

19
def foo(options = {}) 
    options = { ... defaults ... }.merge(options) 
end 
4

आमतौर पर एक हैश में सुरक्षित डिफ़ॉल्ट को समाहित करना सबसे अच्छा होता है जिसे निरंतर घोषित किया जाता है। उदाहरण के लिए:

'ostruct'

require 'ostruct' 

class Tiger < OpenStruct 
    DEFAULTS = { 
    :num_stripes => 12, 
    :max_speed => 43.2 
    }.freeze 

    def initialize(options = { }) 
    super(DEFAULTS.merge(options)) 
    end 
end 

tiger = Tiger.new(:max_speed => 19.95) 

puts tiger.max_speed 
puts tiger.num_stripes 

की आवश्यकता होती है जब हैश वस्तुओं है कि स्ट्रिंग और प्रतीक चाबियाँ अलग हैं और जैसा कि आप उम्मीद कर सकते हैं संयोजित नहीं किए जाएंगे विलय नोट करना महत्वपूर्ण है। रेल पर्यावरण में, आप हमेशा एक को दूसरे में हैश # symbolize_keys का उपयोग करके या उन्हें हैशविथ इंडिफ़िफरएपएप के रूप में घोषित करके जो आपके लिए अंतर दूर कर सकते हैं।

3

यदि कोई इसे Google से देख रहा है, तो यह प्रश्न पुराना और पुराना है। आधुनिक और अधिक क्लीनर उत्तर (रूबी> 2.0 के साथ) कीवर्ड तर्कों का उपयोग करना है। उनके पास कई फायदे हैं।

1.) आपको हैश में कुंजी के नाम की आवश्यकता हो सकती है। (रूबी में> 2.1)

2.) आपको फ़ंक्शन में हैश को "अनपैक" करने की आवश्यकता नहीं है। चाबियाँ आपको चर के रूप में सौंपी जाती हैं। (इस प्रकार आप speed = opts[:speed] की तरह करने के लिए की जरूरत नहीं है)

3.) यह क्लीनर

def foo(num_stripes: 12, **rest) 
    print num_stripes, rest 
end 

foo({max_speed: 42}) # would print '12, {max_speed: 42}' 

यहाँ पूर्ण माणिक दस्तावेज़ देख सकेंगे है: http://www.ruby-doc.org/core-2.1.0/doc/syntax/methods_rdoc.html#label-Array%2FHash+Argument

और एक अच्छा छोटे से ब्लॉग पोस्ट यहाँ: http://robots.thoughtbot.com/ruby-2-keyword-arguments