加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读