使用实例变量& self.variable

时间:2012-03-01 22:03:16

标签: ruby-on-rails ruby ruby-on-rails-3

ruby​​ gem BCrypt有一个如何使用其中一个模块的示例。取自文档:

def password
  @password ||= Password.new(self.password_hash)
end

def password=(new_password)
  @password = Password.create(new_password)
  self.password_hash = @password
end

当我们拥有@password属性时,为什么我们会使用实例变量self.password_hash?我觉得我错过了一些东西,可能是因为我对红宝石缺乏经验。就个人而言,我本可以完成我认为的相同:

def password
  self.password_hash ||= Password.new(self.password_hash)
end

def password=(new_password)
  self.password_hash = Password.create(new_password)
end

1 个答案:

答案 0 :(得分:2)

区别如下:password hash是一个字符串 - 密码的哈希值。但是Password.new(self.password_hash)会创建Password类的新对象。因此差异:String vs Password。您可以在cost对象上调用versionPassword等方法,这些方法不适用于String

我猜您发现以下方法很奇怪:

def password=(new_password)
  @password = Password.create(new_password)
  self.password_hash = @password
end

但是这里发生了什么,不明显的是Password赋值中String对象到self.password_hash对象的转换 - to_s方法返回哈希值密码和该值存储在数据库中。更重要的是 - @password实例变量已设置,因此password方法将返回Password类的实例,而不是密码哈希String