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
答案 0 :(得分:2)
区别如下:password hash是一个字符串 - 密码的哈希值。但是Password.new(self.password_hash)
会创建Password
类的新对象。因此差异:String
vs Password
。您可以在cost
对象上调用version
,Password
等方法,这些方法不适用于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
。