एक उदाहरण विशेषता जोड़ें (जैसे @my_attribute
)
और फिर परिभाषित
def my_attribute
@my_attribute ||= initialize_my_attribute
end
(नोट:। initialize_my_attribute
एक समारोह/विधि आप को क्रियान्वित किया है कि मूल्य तुम चाहते हो लोड होगा है)
यह कैसे काम करता है: विशेषता nil
मान से शुरू होती है (हमने इसमें कुछ भी असाइन नहीं किया है)। ऑब्जेक्ट इंस्टेंस इसे सीधे एक्सेस नहीं कर सकता है, क्योंकि हमने उस पर एक विशेषता एक्सेसर परिभाषित नहीं किया है। इसके बजाए हमारे पास एक विधि है जिसमें विशेषता के समान सटीक नाम है, ताकि जब आप my_object.my_attribute
पर कॉल करते हैं, तो ऐसा लगता है कि जब आप वास्तव में ऑब्जेक्ट इंस्टेंस की विधि को कॉल कर रहे हैं तो आप विशेषता का उपयोग कर रहे हैं।
विधि में क्या होता है? ||=
कम हाथ
@my_attribute = (@my_attribute || initialize_my_attribute)
@my_attribute
पहले से ही महत्व है तो अगर के बराबर है कि मान दिया जाता है। अन्यथा, @my_attribute
एक मान असाइन किया जाता है (और फिर लौटाया जाता है)। दूसरे शब्दों में: मान को @my_attribute
में पहली बार एक्सेस किया जाएगा (और केवल पहली बार)।
और वॉयला! धीरे लोड हो रहा है।
स्रोत
2011-03-07 16:50:57
आप इसे इस तरह क्यों करना चाहते हैं? यह ठीक है कि एक संगठन के लिए क्या है। – tadman
@tadman b/c यह अभी तक मेरे लिए काम नहीं कर रहा है, देखें: http://stackoverflow.com/questions/5215836/could-i-add-an-association-based-on-another-association – Blankman