我正在尝试获得良好的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
时,它可以正常工作。为什么?
答案 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
所指的定义。