5

我正在尝试获得良好的 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,它可以工作。为什么?

4

2 回答 2

8

发生这种情况是因为不能使用显式接收器调用私有方法,并且说是显式指定应该接收self.sanitize_name的对象( ) ,而不是依赖于隐式接收器(也是)。selfsanitize_nameself

您无法避免这种情况,您要么需要在sanitize_name没有明确接收者的情况下调用普通旧的,要么执行self.send(:sanitize_name). 我不确定总是明确指定self真的是“好风格”,但这是主观的。如果要确保调用的是方法而不是变量,请添加括号:

def a; "method"; end
a = "variable"
a() #=> "method"
a   #=> "variable"
于 2012-08-12T16:21:39.347 回答
2

为什么?

根据定义。私有方法只能由无接收消息发送调用,这就是什么意思的定义。private

于 2012-08-13T01:23:24.913 回答