2012-08-13 19 views
5

द्वारा झूठी बनाना इस रूबी में एक डिफ़ॉल्ट सेट करने के लिए एक आम तरीका है जिस तरह से यह करने के लिए:एक विकल्प डिफ़ॉल्ट

class VerboseByDefault 
    def initialize(opts = {}) 
    @verbose = opts.include?(:verbose) ? opts[:verbose] : true 
    end 
end 

क्या सबसे अच्छा/साफकोड करने के लिए रास्ता है? (मैं निश्चित रूप से इसे कारक बना सकता हूं।)

रूबी कोड में सामान्य रूप से कौन सा पैटर्न व्यापक रूप से उपयोग किया जाता है? क्या ActiveSupport के लिए एक पैटर्न है?

ranting पी.एस .: मैं कोड है कि एक डिफ़ॉल्ट true बनाम कोड है कि एक डिफ़ॉल्ट false विकल्प संभालती संभालती के बीच विषमता पसंद नहीं है - (मैं एक पूर्ण आदेश पंक्ति विकल्प पार्सर की जरूरत नहीं है कम से कम बेहतर है।)। एक पैटर्न जो दोनों के बीच बदलता है - बिना बग के - यह देखने के लिए एक अच्छी बात होगी।

उत्तर

7

यह हैश दूसरा तर्क का उपयोग करना है करने के लिए एक आसान तरीका #

class VerboseByDefault 
    def initialize(opts = {}) 
    @verbose = opts.fetch(:verbose, true) 
    end 
end 

जटिल चूक के लिए लाने, लाने भी एक ब्लॉक है, जो मार डाला जाता है ले जा सकते हैं, तो मूल्य हैश में नहीं है । देखें: http://ruby-doc.org/core-1.9.3/Hash.html#method-i-fetch

+0

बहुत अच्छा! मैं * इसे पहले देखा होगा, लेकिन मुझे यह याद नहीं आया। धन्यवाद! –

1

मैंने आमतौर पर इसे अपने सभी डिफ़ॉल्ट सेट करने के रूप में देखा है, और फिर उन्हें ऑप्ट्स के साथ विलय कर दिया है। जैसे ..

def initialize(opts = {}) 
    @options = { :verbose => false, :foo => 42 } 
    @options.merge!(opts) 
    # ... 
end 

इस प्रकार आपके सभी विकल्प एक ही स्थान पर सेट हैं और आप बस उपयोगकर्ता द्वारा आपूर्ति किए गए लोगों को विलय करते हैं।

+0

मुझे डिफ़ॉल्ट आपूर्ति के साथ शुरू करने और उपयोगकर्ता द्वारा प्रदान किए गए विकल्पों में विलय करने का विचार पसंद है, लेकिन आपको एक बग मिला है कि आप 'विकल्प' कैसे गुंजाइश करते हैं! अपना 'स्वयं' देखें। :) –

+0

ओह क्षमा करें यह एक पूर्ण समाधान के रूप में नहीं था :) मैं इसे संपादित कर दूंगा और इसे अंदर रखूंगा ... – Doon

0
require 'active_support/core_ext/hash/reverse_merge' 
class VerboseByDefault 
    DEFAULTS = { verbose: true } 
    def initialize(opts = {}) 
    opts.reverse_merge!(DEFAULTS) 
    @verbose = opts[:verbose] 
    end 
end 

यह केवल एक विकल्प के लिए थोड़ा क्लीनर नहीं है, लेकिन यदि आपके पास अधिक विकल्प हैं तो यह बेहतर हो जाता है। साथ ही, यह true और false के लिए समान पैटर्न का उपयोग करता है।

संबंधित मुद्दे