Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby self.attribute与@attribute的优势?_Ruby - Fatal编程技术网

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