2009-08-09 8 views
9

में 'स्वयं' का उपयोग कब इस विधि:रूबी

def format_stations_and_date 
    from_station.titelize! if from_station.respond_to?(:titleize!) 
    to_station.titleize! if to_station.respond_to?(:titleize!) 
    if date.respond_to?(:to_date) 
     date = date.to_date 
    end 
    end 

जब date नहीं के बराबर है इस त्रुटि के साथ विफल:

NoMethodError (You have a nil object when you didn't expect it! 
The error occurred while evaluating nil.to_date): 
    app/models/schedule.rb:87:in `format_stations_and_date' 
    app/controllers/schedules_controller.rb:15:in `show' 

हालांकि, अगर मैं date = date.to_dateself.date = self.date.to_date को बदलने के लिए, विधि ठीक से काम करता ।

क्या चल रहा है? आम तौर पर, मुझे self लिखना कब होगा?

संपादित करें: यह सवाल से संबंधित नहीं है, लेकिन कृपया ध्यान दें कि "शीर्षककरण" नहीं है! तरीका।

+0

संभावित डुप्लिकेट [रूबी सेटर्स को "स्वयं" क्यों चाहिए। कक्षा के भीतर योग्यता?] (http://stackoverflow.com/questions/44715/why-do-ruby-setters-need-self-qualification-within-the-class) –

उत्तर

42

जब भी आप स्वयं पर एक सेटर विधि का आह्वान करना चाहते हैं, तो आपको self.foo = bar लिखना होगा। यदि आप केवल foo = bar लिखते हैं, तो रूबी पार्सर पहचानता है कि एक परिवर्तनीय असाइनमेंट के रूप में और अब से स्थानीय चर के रूप में foo के बारे में सोचता है। पार्सर को एहसास करने के लिए, कि आप एक सेटर विधि का आह्वान करना चाहते हैं, और स्थानीय चर निर्दिष्ट नहीं करना चाहते हैं, आपको obj.foo = bar लिखना है, इसलिए यदि ऑब्जेक्ट स्वयं है, self.foo = bar

7

आप असंबद्ध उदाहरण विधि नाम और स्वयं का उपयोग कर एक स्थानीय चर के बीच (यह एक ही दायरे में एक ही नाम के साथ दोनों होने की अनुमति है)। दूसरे शब्दों में, केवल एक विधि नाम संकल्प होगा यदि दायरे में एक ही नाम के स्थानीय या ब्लॉक चर नहीं हैं। देखें:

class Foo 
    attr_accessor :boo 
    def do_boo 
    boo = 123 
    puts "Locvar: #{boo} Method: #{self.boo}" 
    end 
end 
Foo.new.do_boo 

यहां क्यों है: कल्पना करें कि आपके पास एक मॉड्यूल है जो एक विधि लागू करता है। यह विधि कुछ आंतरिक गणना के लिए उपयोग की जाने वाली आंतरिक स्थानीय चर "foo" को कुछ निर्दिष्ट करती है। यदि आप "स्वयं" भाग को छोड़ देते हैं, तो विधि ऑब्जेक्ट पर "foo =" विधि कॉल करेगी, जिसकी कक्षा में मॉड्यूल शामिल है, जो लेखक का इरादा नहीं था और यह सीधे विनाशकारी हो सकता है।

class Foo 
    def bar=(new_value_of_bar) 
    set_off_nukes(new_value_of_bar/3) 
    end 
end 

module InnocentModule # written by a different author elsewhere 
    def do_useful_stuff 
    ... 
    bar = Math.sin(something) # we're dead 
    end 
end 
Foo.send(:include, InnocentModule) 

एक और महत्वपूर्ण हिस्सा है जहाँ आप स्वयं उपयोग करने के लिए जब वस्तु # वर्ग विधि लागू है, क्योंकि बस "वर्ग" कह रूबी के लिए एक वर्ग कीवर्ड का मतलब है।