我正在尝试获得良好的 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
上面的代码导致错误
private method
sanitize_name
called
但是当删除 self.
并仅使用 sanitize_name
时,它会起作用。这是为什么?
最佳答案
发生这种情况是因为无法使用显式接收器调用私有(private)方法,并且说 self.sanitize_name
是显式指定应该接收 sanitize_name 的对象 (
,而不是依赖于隐式接收器(也是 self
) self
)。
你无法避免这种情况,你要么需要在没有显式接收器的情况下调用普通的旧 sanitize_name
,要么执行 self.send(:sanitize_name)
。我不确定总是显式指定 self
是否真的是“好风格”,但这是主观的。如果您想确保调用的是方法而不是变量,请添加括号:
def a; "method"; end
a = "variable"
a() #=> "method"
a #=> "variable"
关于ruby - 从另一个私有(private)方法中使用 self.xxx() 调用私有(private)方法 xxx,导致错误 "private method ` xxx' called”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11923672/