2016-03-10 3 views
18

रेल में, आप hash.try(:[], :key) कर सकते हैं जो hash संभावित nil पर मदद करता है। क्या [] के साथ नए रूबी 2.3 सुरक्षित नेविगेशन ऑपरेटर &. का उपयोग करने के लिए कोई समतुल्य संस्करण है?रेल के बराबर सुरक्षित नेविगेशन हैश

+0

की संभावित डुप्लिकेट [रूबी - प्रवेश बहुआयामी हैश और से बचने के लिए उपयोग नहीं के बराबर वस्तु] (https://stackoverflow.com/प्रश्न/10130726/रूबी-एक्सेस-बहु-आयामी-हैश-एंड-टावर-एक्सेस-शून्य-ऑब्जेक्ट) – kolen

उत्तर

22

&. रेल 'try के बराबर नहीं है, लेकिन आप हैश के लिए &. उपयोग कर सकते हैं। बस इसका इस्तेमाल करें, कुछ खास नहीं।

hash[:key1]&.[](:key2)&.[](:key3) 

हालांकि मैं ऐसा नहीं करता। एक निराला मामले में

Class Hash 
    def deep_fetch *args 
     x = self 
     args.each do |arg| 
     x = x[arg] 
     return nil if x.nil? 
     end 
     x 
    end 
end 

और फिर

response.deep_fetch 'PaReqCreationResponse', 'ThreeDSecureVERes', 'Message', 'VERes', 'CH', 'enrolled' 

:

+2

'& .' और' try' के साथ अच्छा बिंदु अलग है। मैं केवल 'हैश' के मामले में सोच रहा था 'शून्य'। जो मैंने समाप्त किया था वह 'हैश एंड। [] (: कुंजी) ' –

+0

यह केवल रूबी 2.3+ के लिए काम करता है? – bbozo

+0

@bbozo हां। रुबी 2.3 में '& .' पेश किया गया था। – sawa

2

स्वीकृत जवाब जब hash नहीं के बराबर है के लिए खाते में नहीं होगा ...

आप क्या आप .try से पहले सुरक्षित एनएवी ऑपरेटर का उपयोग किया है और कहा कि

hash&.try(:[], :key)

काम करेंगे, लेकिन आप को फिर से लिखने कर सकते हैं भी उपयोग कर सकते हैं:

http://ruby-doc.org/core-2.3.0_preview1/Hash.html#method-i-dig

एक w ay आप

hash&.dig(:key1, :key2 ...) 

जो शून्य वापस आ जाएगी यदि कोई कुंजी लाने मौजूद नहीं है एक हैश पर ऐसा कर सकता है ऐसा करने से है ...।

{ key1: { key2: 'info' } } 

'जानकारी' वापसी होगी

{ key1: { wrong_key: 'info' } } 

वापसी होगी nil

20

पूर्व रूबी 2.3

मैं आमतौर पर मेरी intializer में डाल की तरह कुछ था।

Retrieves:

समुदाय में आम सहमति से बचने के लिए दोनों की कोशिश और अकेला ऑपरेटर &.

रूबी 2.3 और बाद में

Hash#dig विधि नहीं है कि अब सिर्फ इतना है कि करता है करने के लिए हो रहा है प्रत्येक कुंजी ऑब्जेक्ट्स के साथ बार-बार मान ऑब्जेक्ट।

h = { foo: {bar: {baz: 1}}} 

h.dig(:foo, :bar, :baz)   #=> 1 
h.dig(:foo, :zot)     #=> nil 

http://ruby-doc.org/core-2.3.0_preview1/Hash.html#method-i-dig

+1

उपयोग मामलों में 'dig' के लिए संदिग्ध रूप से समान दिखता है, 2.3 में बस '&।' के रूप में पेश किया गया। कोई अंतर? –

+0

वास्तव में, धन्यवाद! :) – bbozo

+4

आईएमएचओ यह स्वीकार्य उत्तर होना चाहिए। –

1

जबकि hash&.[](:key) प्रशिक्षित rubyist को सुरुचिपूर्ण है, मैं सिर्फ hash && hash[:key] के रूप में यह बेहतर और अधिक सहज प्रोग्रामर मेरे बाद आने वाले है, जो के साथ के रूप में परिचित नहीं हो सकता है के लिए पढ़ता है का उपयोग करेंगे रूबी की जटिलताओं। कोडबेस में कुछ अतिरिक्त वर्ण कभी-कभी किसी और के लिए गुगलिंग को पूरा कर सकते हैं।

(संदर्भ आप का उपयोग करने के लिए इस में, एक सशर्त बयान में है निश्चित रूप से चाहते हैं को देखते हुए।)

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