使用另一个私有方法中的self.xxx()调用私有方法xxx导致错误“私有方法`xxx'调用”

时间:2012-08-12 16:11:17

标签: ruby private

我正在尝试获得良好的Ruby编码风格。为了防止意外调用具有相同名称的局部变量,我总是在适当的地方使用self.。但现在我偶然发现了这个:

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

以上代码导致错误

  

名为

的私有方法sanitize_name

但是在删除self.并使用sanitize_name时,它可以正常工作。为什么?

2 个答案:

答案 0 :(得分:8)

这是因为无法使用显式接收器调用私有方法,并且self.sanitize_name明确指定应该接收self的对象(sanitize_name),而不是依赖于隐式接收者(也是self)。

你无法避免这种情况,你需要在没有明确接收者的情况下调用普通的sanitize_name,或者self.send(:sanitize_name)。我不确定始终明确指定self是否真的&#34;好的风格&#34;,但这是主观的。如果您想确保调用方法而不是变量,请添加括号:

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

答案 1 :(得分:2)

  

为什么?

根据定义。私有方法只能通过无接收者消息发送来调用,这是private所指的定义