2012-08-12 26 views
5

我试图得到一个很好的Ruby编码风格。为了防止意外调用同名的局部变量,我总是在适当的地方使用self.。但现在我绊了这一点:调用一个私有方法xxx使用self.xxx()从另一个私有方法导致错误“私人方法`xxx”所谓的“

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 

上面的代码导致错误

称为

但在移除self.,只是使用sanitize_name的时候,它的工作原理私有方法sanitize_name。为什么?

回答

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

谢谢你的解释。我会牢记这一点,但我想要真正理解它,我必须深入挖掘Ruby的内部,对吧? – 2012-08-12 16:28:37

+3

@JoshuaMuheim不一定,这只是私人方法的工作方式,通过禁止明确的接收者是不能从任何地方调用隐含的接收者是不一样的'自我',它只是有一些不幸的副作用,阻止你从使用与隐式接收器相同的显式接收器来调用私有方法。 – 2012-08-12 16:31:00

+0

好的,这很有趣。非常感谢您的解释。 :) – 2012-08-12 16:52:56

2

为什么?

按照定义。私人方法只能由无接收方的消息发送调用,这就是private的含义。

+0

+1 Short&sweet。 – 2012-08-13 11:15:12