Ruby self.attribute与@attribute的优势?
假设:Ruby self.attribute与@attribute的优势?,ruby,Ruby,假设: def create_new_salt self.salt = self.object_id.to_s + rand.to_s end 为什么使用“self.”比使用实例变量“@salt”更好?使用self.salt=将导致使用salt=方法(如果已定义)。这有助于确保使用salt=方法内部的任何错误检查/转换。但是,这意味着必须有一个显式的salt=方法(例如,可能由attr\u访问器创建),这不一定是个好主意 概要:如果您有一个自定义的salt=方法,请使用self.salt=
def create_new_salt
self.salt = self.object_id.to_s + rand.to_s
end
为什么使用“self.”比使用实例变量“@salt”更好?使用
self.salt=
将导致使用salt=
方法(如果已定义)。这有助于确保使用salt=
方法内部的任何错误检查/转换。但是,这意味着必须有一个显式的salt=
方法(例如,可能由attr\u访问器创建),这不一定是个好主意
概要:如果您有一个自定义的salt=
方法,请使用self.salt=
;如果您确切地知道您想要的是什么,或者如果您没有自定义的salt=
方法,请使用@salt=
最后一点:我可能会这样写(在我看来,它更清晰一些)
编辑:多亏了@Chuck对另一个答案的评论,我修改了它,删除了self。
-免费代码-这是错误的。除了Peter的好答案,我通常用Ruby表示我正在使用attr\u访问器
,使用self.attr=和self.attr代替@attr
编辑:如果没有“self”,您将创建一个局部变量。Yekes.关于彼得的回答:
另一个有趣的点是,即使salt=方法是私有的,也可以调用self.salt=
。这是普通Ruby规则的一个例外,即私有方法不能通过显式接收器调用。事实上,只需编写salt=5
,而不指定self
,因为接收器将创建一个局部变量。@Chuck,这是一个非常重要的点,我没有意识到。我修改了我的答案。哇,我一直在为ruby编程,但不知怎么的,我从来不知道这一点,谢谢!非常感谢彼得!我同意,我更喜欢你的版本。
def create_new_salt
@salt = "#{object_id}#{rand}"
end