2012-08-12 184 views
5

मैं एक अच्छी रूबी कोडिंग शैली प्राप्त करने की कोशिश कर रहा हूं। एक ही नाम के साथ स्थानीय चर को गलती से कॉल करने से रोकने के लिए, मैं हमेशा self. का उपयोग कर रहा हूं जहां उचित हो। एक त्रुटिself.xxx() का उपयोग करके एक निजी विधि xxx को किसी अन्य निजी विधि के भीतर कॉल करने के परिणामस्वरूप त्रुटि "निजी विधि 'xxx' कहा जाता है"

निजी विधि sanitize_name

लेकिन जब self. को दूर करने और सिर्फ sanitize_name का उपयोग कर, यह काम करता है कहा जाता है में

class MyClass < ActiveRecord::Base 
    before_validation :sanitize_user_data 

    private 

    def sanitize_user_data 
    self.sanitize_name # with ".self" it's a problem, without it's not! 
    end 

    def sanitize_name 
    unless self.name.nil? 
     self.name.gsub!(/\s+/, ' ') 
     self.name.strip! 
    end 
    end 
end 

ऊपर कोड परिणाम: लेकिन अब मैं इस पर ठोकर खाई। यही कारण है कि?

उत्तर

8

यह इसलिए होता है क्योंकि निजी तरीकों कह self.sanitize_name स्पष्ट रूप से वस्तु (self) कि sanitize_name प्राप्त करना चाहिए, बल्कि निहित रिसीवर पर भरोसा करने की बजाय (जो भी self है) को निर्दिष्ट किया जाता है एक स्पष्ट रिसीवर के साथ नहीं कहा जा सकता है, और।

आप इससे बच नहीं सकते हैं, आपको या तो स्पष्ट रिसीवर के बिना सादे पुराने sanitize_name पर कॉल करने की आवश्यकता है, या self.send(:sanitize_name) करें। मुझे यकीन नहीं है कि हमेशा स्पष्ट रूप से self निर्दिष्ट करना वास्तव में "अच्छी शैली" है, लेकिन यह व्यक्तिपरक है।

def a; "method"; end 
a = "variable" 
a() #=> "method" 
a #=> "variable" 
+0

स्पष्टीकरण के लिए धन्यवाद। मैं इसे ध्यान में रखूंगा, लेकिन मुझे लगता है कि वास्तव में इसे समझना है, मुझे रूबी के आंतरिक में गहराई से खोदना होगा, है ना? –

+3

@ जोशुआमुइम जरूरी नहीं है, यह एक निजी रिसीवर को प्रतिबंधित करके निजी तरीके से काम करने का तरीका है, कहीं भी नहीं कहा जा सकता है कि निहित रिसीवर एक ही 'आत्म' नहीं है, यह आपके पास कुछ हद तक दुर्भाग्यपूर्ण दुष्प्रभाव है जो आपको रोकने से रोकता है निहित रिसीवर के रूप में एक ही स्पष्ट रिसीवर के साथ एक निजी विधि बुलाओ। –

+0

ठीक है, यह दिलचस्प है। व्याख्या करने के लिए बहुत बहुत धन्यवाद। :) –

2

कि क्यों है: आप सुनिश्चित करने के लिए आप के लिए एक विधि के बजाय एक चर कॉल कर रहे हैं चाहते हैं, कोष्टक जोड़ सकता हूँ?

परिभाषा के अनुसार। निजी विधियों को केवल एक रिसीवरलेस संदेश भेजकर ही बुलाया जा सकता है, का परिभाषा है।

+0

+1 लघु और मीठा। –

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