Ruby on rails ActiveSupport::Concern中的实例变量
我已经读到ruby中的模块(在本例中为ActiveSupport::Concern)在初始化的类的所有实例中共享。所以,如果这是真的,则意味着任何实例变量都将在内存中的所有实例之间共享Ruby on rails ActiveSupport::Concern中的实例变量,ruby-on-rails,ruby,activesupport,Ruby On Rails,Ruby,Activesupport,我已经读到ruby中的模块(在本例中为ActiveSupport::Concern)在初始化的类的所有实例中共享。所以,如果这是真的,则意味着任何实例变量都将在内存中的所有实例之间共享 module SetPassword extend ActiveSupport::Concern attr_reader :password def password=(new_password) @password = new_password self.crypted_passwo
module SetPassword
extend ActiveSupport::Concern
attr_reader :password
def password=(new_password)
@password = new_password
self.crypted_password = password_digest(new_password, salt)
end
end
class User
include SetPassword
end
u = User.new; u.password = 'abcdef'
u2 = User.new; u2.password = '123456'
上述代码使用安全吗?或者第二个用户会覆盖第一个用户吗?正在进行呼叫。这意味着,不共享任何内容,这可能很容易检查(ActiveSupport::Concern
与要检查的代码无关。)
他在幕后打电话。这意味着,不共享任何内容,这可能很容易检查(ActiveSupport::Concern
与要检查的代码无关。)
“因此,如果这是真的,则意味着任何实例变量都将在内存中的所有实例之间共享。”这是不正确的。试一试。另外请注意,您的示例中有输入错误,最后一行应该是
u2.password='123456'
(而不是u.password='123456'
)。因此,如果这是真的,则意味着任何实例变量都将在内存中的所有实例之间共享。“这是不正确的。”。试一试。另外请注意,您的示例中有输入错误,最后一行应该是u2.password='123456'
(而不是u.password='123456'
)
module SetPassword
attr_reader :password
def password=(new_password)
@password = new_password
puts <<~EOS
Setting password to: #{@password} (id: #{@password.__id__}).
Object: #{self.class.name} (#{self.__id__}).
Method: #{__callee__} on #{self.method(__callee__).__id__}.
EOS
end
end
class User
include SetPassword
end
u1 = User.new; u1.password = 'abcdef'
u2 = User.new; u2.password = '123456'
▶ u1 = User.new; u1.password = 'abcdef'
#⇒ Setting password to: abcdef (id: 46968741459360).
# Object: User (46968741459420).
# Method: password= on 46968741459040.
▶ u2 = User.new; u2.password = '123456'
#⇒ Setting password to: 123456 (id: 46968734231740).
# Object: User (46968734232020).
# Method: password= on 46968734230640.