ruby-on-rails – 如何在rails中使用self关键字
发布时间:2020-12-17 03:53:36 所属栏目:百科 来源:网络整理
导读:关于rails中的关键字“self”,让我们以下面的代码片段为例. 我知道关键字指的是类本身的实例,例如表达式“self.encrypted_pa??ssword”. 无论如何,我很少知道为什么作为右侧参数传递的属性“password”也没有以self关键字作为前缀? 任何人都可以启发我什么
关于rails中的关键字“self”,让我们以下面的代码片段为例.
我知道关键字指的是类本身的实例,例如表达式“self.encrypted_pa??ssword”. 无论如何,我很少知道为什么作为右侧参数传递的属性“password”也没有以self关键字作为前缀? 任何人都可以启发我什么时候使用或不使用自我关键字后我的例子给? class User < ActiveRecord::Base attr_accessor :password attr_accessible :name,:email,:password,:password_confirmation validates :password,:presence => true,:confirmation => true,:length => { :within => 6..40 } before_save :encrypt_password private def encrypt_password self.encrypted_password = encrypt(password) end def encrypt(string) string # Only a temporary implementation! end end 解决方法
回答
答案很简单:范围可见性. def encrypt_password self.encrypted_password = encrypt(password) end 有(或者更确切地说,应该在运行时)有一些叫做密码的东西.在您的情况下,它是数据库中的属性.但它也可以是局部变量.如果找不到此名称,将引发错误. 但是你必须在encrypted_pa??ssword前加上self来明确声明你要更新实例属性.否则,将创建新的局部变量encrypted_pa??ssword.显然,不是你想要的效果. 更多解释 这里有一小段代码 class Foo attr_accessor :var def bar1 var = 4 puts var puts self.var end end f = Foo.new f.var = 3 f.bar1 产量 4 3 因此,正如我们所看到的,var是在没有self关键字的情况下分配的,因此,现在范围内有两个名称var:局部变量和实例属性. Instance属性由局部变量隐藏,因此如果您确实想要访问它,请使用self. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |