如何在内存中管理虚拟属性?
How are virtual attributes managed in memory?
我正在研究 Michael Hartl 的 rails tutorial 并且已经到了他定义虚拟属性 remember_token
并稍后在 remember
实例中为其分配值的地步方法:
class User < ApplicationRecord
attr_accessor :remember_token
...
def remember
self.remember_token = User.new_token
update_attribute(:remember_digest, User.digest(remember_token))
end
end
他然后在 remember
被调用后在辅助方法中访问虚拟属性的值:
def remember(user)
user.remember
cookies.permanent.signed[:user_id] = user.id
cookies.permanent[:remember_token] = user.remember_token
end
我的解释是,在 remember
方法执行后(并且在分配 remember_token
的地方,它已从内存中删除。显然这里不是这种情况,因为它仍然可以在分配时使用cookies.permanent[:remember_token]
.
的新值
我想我的困惑源于数据持久性。假设借助attr_accessor
将remember_token
做成实例变量,什么时候正式不可用?
你的假设是错误的。
"Virtual attributes" 实际上只是一个术语,用于模型中的普通旧实例属性,以区别于持久化的数据库支持属性。
只要封装它们的对象存在,实例属性就会保留它们的值(或者您明确地将该值设为 nil)。该对象存在直到垃圾收集器 can determine that it is no longer referenced.
class Person
attr_accessor :name
def initialize(name: nil)
@name = name
# or using the accessor
self.name = name
end
end
因此,如果我们创建 Person
的实例,它当然会保留 name
:
的值
jane = Person.new(name: 'Jane')
jane.name # => 'Jane'
您可能会混淆的是局部变量,它们仅在定义它们的块中可用:
class Person
attr_accessor :name
def say_hello
# this local variable is garbage collect after the method is called
phrase = "Hello, my name is "
puts phrase + name # we can omit self since it is implied
end
end
我正在研究 Michael Hartl 的 rails tutorial 并且已经到了他定义虚拟属性 remember_token
并稍后在 remember
实例中为其分配值的地步方法:
class User < ApplicationRecord
attr_accessor :remember_token
...
def remember
self.remember_token = User.new_token
update_attribute(:remember_digest, User.digest(remember_token))
end
end
他然后在 remember
被调用后在辅助方法中访问虚拟属性的值:
def remember(user)
user.remember
cookies.permanent.signed[:user_id] = user.id
cookies.permanent[:remember_token] = user.remember_token
end
我的解释是,在 remember
方法执行后(并且在分配 remember_token
的地方,它已从内存中删除。显然这里不是这种情况,因为它仍然可以在分配时使用cookies.permanent[:remember_token]
.
我想我的困惑源于数据持久性。假设借助attr_accessor
将remember_token
做成实例变量,什么时候正式不可用?
你的假设是错误的。
"Virtual attributes" 实际上只是一个术语,用于模型中的普通旧实例属性,以区别于持久化的数据库支持属性。
只要封装它们的对象存在,实例属性就会保留它们的值(或者您明确地将该值设为 nil)。该对象存在直到垃圾收集器 can determine that it is no longer referenced.
class Person
attr_accessor :name
def initialize(name: nil)
@name = name
# or using the accessor
self.name = name
end
end
因此,如果我们创建 Person
的实例,它当然会保留 name
:
jane = Person.new(name: 'Jane')
jane.name # => 'Jane'
您可能会混淆的是局部变量,它们仅在定义它们的块中可用:
class Person
attr_accessor :name
def say_hello
# this local variable is garbage collect after the method is called
phrase = "Hello, my name is "
puts phrase + name # we can omit self since it is implied
end
end