2013-01-05 11 views
8

में एक कुंजी-मूल्य जोड़ी का सशर्त समावेशन कोई मुझे निम्नलिखित विधि को छोटा करने में मदद कर सकता है? मैंने इसके साथ शुरुआत की, जिसे मुझे बस ठीक लगा:हैश

def self.some_hash 
    { "foo" => "bar" } 
end 

अब मैं एक वैकल्पिक कुंजी जोड़ना चाहता हूं। tersest वाक्य रचना मैं के बारे में सोच सकते हैं यह है:

def self.some_hash(some_key=nil) 
    answer = { "foo" => "bar" } 
    answer[some_key] = "yucky, long-winded syntax" if some_key 
    answer 
end 

संशोधित विधि काम करता है, लेकिन मैं आभासी स्याही की बर्बादी से असंतुष्ट हूँ। क्या इसे छोटा करने का कोई तरीका है? मुझे एहसास है कि कोई हैश शाब्दिक पर एक टर्नरी ऑपरेटर को नियोजित कर सकता है, लेकिन इससे स्थिति की प्रत्येक शाखा पर "foo" => "bar" जोड़ी दोहराई जाएगी (जो मुझे लगता है), जो प्रिस्टिन से थोड़ा कम है।

+0

"मुझे निम्न विधि को छोटा करने में मदद करें" एक दे दिया गया है यह codereview.stackexchange.com पर होना चाहिए जहां वे समीक्षा करते हैं और refactoring और अनुकूलन के साथ मदद करते हैं। –

+0

इस प्रश्न को बंद करने के लिए दुखद, जब यह वास्तव में पूछ रहा है, "मैं सशर्त रूप से एक हैश में एक कुंजी/मूल्य जोड़ी कैसे शामिल करूं?"। मैंने [रूबी 2.0 के डबल-स्प्लैट ऑपरेटर] (http://stackoverflow.com/a/37474217/122087) का उपयोग करके कहीं और जवाब लिखा था। –

+0

@PaulAJungwirth, मुझे लगता है कि यह बंद कर दिया गया था क्योंकि मैं केवल काम कोड सुधारना चाहता था। मैंने इसके बजाय कुछ कचरा वाक्यविन्यास बनाया होगा और फिर कहा था कि यह काम नहीं कर रहा था, और सभी SO में अच्छा होगा। ** ऑपरेटर के बारे में यह एक महान युक्ति है! धन्यवाद <--- निराशाजनक 'एक टिप्पणी में धन्यवाद एक और गूंगा, यहाँ चारों ओर मानक है, लेकिन - धन्यवाद! – danh

उत्तर

8
def self.some_hash(some_key = nil) 
    {"foo" => "bar"}.merge(some_key ? {some_key => "yucky, long-winded syntax"} : {}) 
end 

या, मूल हैश,

def self.some_hash(some_key = nil) 
    {"foo" => "bar"} 
    .tap{|h| h.merge!(some_key => "yucky, long-winded syntax") if some_key} 
end 

को संशोधित करता है, तो या, शायद आप यह एक तरह से पास अपने मूल करने के लिए कर सकते हैं:

def self.some_hash(some_key = nil) 
    {"foo" => "bar"} 
    .tap{|h| h[some_key] = "yucky, long-winded syntax" if some_key} 
end 
+1

ओह। यह असली अच्छा है। लघु, जैसे @ केली, और स्पष्ट। यह भी अच्छा है क्योंकि इसमें सशर्त रूप से हटाने के बजाए शामिल हैं। धन्यवाद। पहले (कार्यात्मक) स्निपेट के लिए – danh

+0

+1, मैं जितना संभव हो सके 'टैप' तक रहूंगा (IMHO यह अनिवार्य, अस्पष्ट कोड को बढ़ावा देता है) – tokland

+0

धन्यवाद। .tap के बारे में सीखने की भी सराहना करते हैं। मेटा प्रश्न: मेरे प्रश्न को संपादित करने के लिए धन्यवाद। क्या संपादन को स्वीकार करने के लिए मुझे कुछ कदम उठाना चाहिए? – danh

1

मैं वास्तव में यह पसंद नहीं है, लेकिन यह बहुत संक्षिप्त (और भ्रामक) है

def self.some_hash(some_key=nil) 
    Hash[[["foo", "bar"], [some_key, "some value"]].select(&:first)] 
end 

यह एक थोड़ा बेहतर हो सकता है।

def self.some_hash(some_key=nil) 
    {"foo" => "bar", some_key => "some_value"}.keep_if{ |k, _| k } 
end 

Hash#keep_if

+0

धन्यवाद। यह कम से कम एक +1 के लिए एक +1 है। यह देखने के लिए थोड़ा इंतजार होगा कि और क्या सुझाव दिया गया है। – danh

+0

@danh मैंने आपके लिए एक और जोड़ा जो मुझे लगता है कि थोड़ा बेहतर है। – Kyle

+0

मेरी इच्छा है कि मैं दो बार मतदान कर सकता हूं। मुझे लगता है कि आपका दूसरा विचार स्पष्ट और छोटा है, लेकिन @Sawa हमें एक जोड़ + सशर्त हटाने से बचाता है। Keep_if के बारे में कभी नहीं सुना, और सीखने की भी सराहना करते हैं! – danh