self.attribute与@attribute的优点?

时间:2009-12-09 23:57:20

标签: ruby

假设如下:

def create_new_salt
  self.salt = self.object_id.to_s + rand.to_s
end

为什么使用'self'更好。而不是实例变量'@salt'?

3 个答案:

答案 0 :(得分:13)

如果已定义,使用self.salt =将导致使用salt=方法。这对于确保使用salt=方法中的任何错误检查/转换非常有用。但是,这意味着必须有一个明确的salt=方法(例如,可能由attr_accessor创建),这不一定是个好主意。

摘要:如果您使用自定义self.salt =方法,请使用salt=;如果您确切知道自己想要@salt =的内容,或者您​​没有自定义@salt方法,请使用salt=

最后说明:我可能会这样写(我认为它更清晰一点)

def create_new_salt
  @salt = "#{object_id}#{rand}"
end

编辑:感谢@ Chuck对另一个答案的评论,我已将其修改为删除self. - 免费代码 - 这是错误的。

答案 1 :(得分:4)

除了彼得的好答案之外,我通常在Ruby中表示我使用的是attr_accessor,使用self.attr =和self.attr而不是@attr。

编辑:没有“自我”,你就是在创建一个局部变量。让人惊讶。

答案 2 :(得分:2)

继Peter的回答:

另一个有趣的观点是即使salt =方法是私有的,也可以调用self.salt=。这是普通Ruby规则的一个例外,即无法使用显式接收器调用私有方法。