2009-12-09 32 views

回答

13

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

摘要:如果您有自定义的salt=方法,请使用self.salt =;使用@salt =如果你确切知道你想要@salt是什么,或者如果你没有自定义salt=方法。

最后说明一点:我可能会写这样的(在我看来这是一个更清晰一点)

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

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

+0

非常感谢彼得!我同意,我更喜欢你的版本。 – Kevin 2009-12-10 01:41:47

4

除了Peter的很好的回答,我通常在Ruby中表示我使用的是self.attr =和self.attr而不是@attr使用attr_accessor

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

+0

是的,这些都是好的... – Peter 2009-12-10 00:09:36

+2

事实上,只要写'salt = 5'而不指定'self'作为接收者就会*创建一个局部变量。 – Chuck 2009-12-10 00:22:56

+0

@Chuck,这是我没有意识到的一个非常重要的观点。我修改了我的答案。 – Peter 2009-12-10 00:34:58

2

继彼得的回答是:

另一个有趣的一点是,self.salt=可以被调用,即使盐=方法是私有的。这是普通Ruby规则的一个例外,即一个私有方法不能用明确的接收方来调用。