首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >ActiveSupport::Concern中的实例变量

ActiveSupport::Concern中的实例变量
EN

Stack Overflow用户
提问于 2019-02-27 12:02:50
回答 1查看 1K关注 0票数 1

我读到ruby中的模块(在本例中是ActiveSupport::Concern)在初始化的类的所有实例之间共享。因此,如果这是真的,这意味着任何实例变量都将在内存中的所有实例之间共享。

代码语言:javascript
复制
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'

上面的代码使用起来安全吗?或者第二个用户会覆盖第一个用户?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-27 13:32:13

Module#include正在暗中调用Module#append_features。这意味着,没有任何东西是共享的,这可能很容易检查(ActiveSupport::Concern与您要检查的代码无关)。

代码语言:javascript
复制
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'

代码语言:javascript
复制
▶ 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.
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54897865

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档