ruby-on-rails - 如何在 Rails 中使用 "self"关键字

标签 ruby-on-rails ruby oop

关于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

谁能解释一下何时使用或不使用 self 关键字?

最佳答案

回答

答案很简单:范围可见性。

def encrypt_password
  self.encrypted_password = encrypt(password)
end

有(或者更确切地说,应该在运行时有)东西叫做password。在您的情况下,它是数据库中的一个属性。但它也可以是局部变量。如果找不到这样的名称,则会引发错误。

但您必须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作用域:局部变量和实例属性。实例属性被局部变量隐藏,所以如果你真的想访问它,使用self

关于ruby-on-rails - 如何在 Rails 中使用 "self"关键字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8844703/

相关文章:

ruby-on-rails - 创建表和 Controller

ruby-on-rails - 使用 ActiveModel::Serializers 有条件地侧载

ruby - 正则表达式蛋白质消化

c++ - 从父类(super class)对象数组调用子类方法

oop - 覆盖方法调用运算符或其他一些方法来捕获方法名称解析错误

c# - 将接口(interface)转换为其具体实现对象,反之亦然?

ruby-on-rails - rails : Averaging an array of time

javascript - ReactJS 如何处理 Rails 事件记录关联

Ruby:为以后定义命名一个方法?

ruby-on-rails - 如何在 Rails 中为回形针使用自定义服务器?