if account && account.owner && account.owner.address
...
end
यह वास्तव में अत्यधिक शब्द और टाइप करने के लिए कष्टप्रद है: आप निम्नलिखित की तरह कुछ लिखते थे आप सुरक्षित हो सकता है और एक शून्य त्रुटि जोखिम नहीं करना चाहते हैं। - यह या तो पता या nil
लौटाता है यदि श्रृंखला के साथ कुछ मूल्य है
if account.try(:owner).try(:address)
...
end
यह एक ही बात सिद्ध: ActiveSupport try
विधि है जो एक समान व्यवहार (लेकिन कुछ मुख्य अंतर यह है कि बाद में चर्चा की जाएगी साथ) भी शामिल है nil
। पहला उदाहरण झूठी भी लौटा सकता है यदि उदाहरण के लिए owner
गलत पर सेट है।
& का उपयोग करना।
हम सुरक्षित नेविगेशन ऑपरेटर का उपयोग कर पिछले उदाहरण पुनर्लेखन कर सकते हैं:
account&.owner&.address
अधिक उदाहरण
के और अधिक विस्तार में सभी तीन दृष्टिकोण की तुलना करें।
account = Account.new(owner: nil) # account without an owner
account.owner.address
# => NoMethodError: undefined method `address' for nil:NilClass
account && account.owner && account.owner.address
# => nil
account.try(:owner).try(:address)
# => nil
account&.owner&.address
# => nil
अब तक कोई आश्चर्य नहीं है। क्या होगा अगर owner
false
है (शर्टी कोड की रोमांचक दुनिया में असंभव नहीं है)?
account = Account.new(owner: false)
account.owner.address
# => NoMethodError: undefined method `address' for false:FalseClass `
account && account.owner && account.owner.address
# => false
account.try(:owner).try(:address)
# => nil
account&.owner&.address
# => undefined method `address' for false:FalseClass`
यहाँ पहले आश्चर्य आता है - &.
वाक्य रचना केवल nil
छोड़ देता है लेकिन झूठी पहचानता है! यह s1 && s1.s2 && s1.s2.s3
वाक्यविन्यास के बराबर नहीं है।
क्या होगा अगर मालिक मौजूद है लेकिन address
का जवाब नहीं देता है?
account = Account.new(owner: Object.new)
account.owner.address
# => NoMethodError: undefined method `address' for #<Object:0x00559996b5bde8>
account && account.owner && account.owner.address
# => NoMethodError: undefined method `address' for #<Object:0x00559996b5bde8>`
account.try(:owner).try(:address)
# => nil
account&.owner&.address
# => NoMethodError: undefined method `address' for #<Object:0x00559996b5bde8>`
उदाहरण नीचे भ्रामक है और nil&.nil?
true
लौटना चाहिए।
&.
ऑपरेटर का उपयोग करते समय सावधान रहें और nil
मानों की जांच करें।
nil.nil?
# => true
nil?.nil?
# => false
nil&.nil?
# => nil
संदर्भ:: here
वे ही नहीं हैं आप अंतर [यहां] (के बारे में अधिक पढ़ सकते हैं http://mitrev.net/ruby/2015/11/13 निम्नलिखित उदाहरण पर विचार/ऑपरेटर में गहरे लाल रंग का /) – Redithion