Ruby on rails 实例变量的使用&;自变量

Ruby on rails 实例变量的使用&;自变量,ruby-on-rails,ruby,ruby-on-rails-3,Ruby On Rails,Ruby,Ruby On Rails 3,RubyGem有一个如何使用其中一个模块的示例。摘自文件: def password @password ||= Password.new(self.password_hash) end def password=(new_password) @password = Password.create(new_password) self.password_hash = @password end 当我们有self.password\u hash属性时,为什么要使用实例变量@pass

RubyGem有一个如何使用其中一个模块的示例。摘自文件:

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

def password=(new_password)
  @password = Password.create(new_password)
  self.password_hash = @password
end
当我们有
self.password\u hash
属性时,为什么要使用实例变量
@password
?我觉得我错过了一些东西,可能是因为我对ruby缺乏经验。就我个人而言,我本可以通过以下方式实现我认为相同的目标:

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

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

区别如下:密码散列是一个字符串-密码的散列。但是
Password.new(self.Password\u hash)
创建
Password
类的新对象。因此,区别在于:
String
vs
Password
。您可以在
密码
对象上调用
成本
版本
等方法,这些方法对
字符串
不可用

我猜你会觉得以下方法很奇怪:

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

但是这里发生的事情并不明显,
Password
对象转换为
self.Password\u hash
赋值中的
Password
对象-
to\u s
方法返回密码的散列,该值存储在数据库中。此外,设置了
@password
实例变量,因此
password
方法将返回
password
类的实例,而不是我开始回答的密码哈希
字符串

,但随后意识到,您是对的,这有点奇怪。我认为我们必须调查周围的环境,找出
@password
#password\u hash
之间的区别。我认为你的方法是可行的,但可能还有其他副作用,有时需要允许这两种方法有所不同。我唯一能确定的是,
@password
始终是一个密码实例,但它似乎是
#password\u hash
可以,但看起来并不总是这样。有没有其他方法可以调用
#password\u hash=
?谢谢,这很有意义。回顾文档,它确实声明了
self.password\u hash
是数据库中的
:string
+1.