ruby动态添加类变量

ruby动态添加类变量,ruby,class-variables,Ruby,Class Variables,例如: class Base @@var = "base" def self.assign_var(var) @@var = var end def self.show_var @@var end def initialize p @@var end end class A < Base assign_var("a") end class B < Base assign_var("b") end class C

例如:

class Base
  @@var = "base"

  def self.assign_var(var)
    @@var = var
  end

  def self.show_var
    @@var
  end

  def initialize
    p @@var
  end

end

class A < Base
  assign_var("a")
end

class B < Base
  assign_var("b")
end

class C < Base
  assign_var("c")
end

p A.show_var # "c"
p B.show_var # "c"
p C.show_var # "c"
a = A.new # "c"
b = B.new # "c"
c = C.new # "c"
更新

我需要在初始值设定项中访问此变量

class Base
  @var = "base"

  def self.assign_var(var)
    @var = var
  end

  def self.show_var
    @var
  end

  def initialize
    p @var
  end
end

class A < Base
  assign_var("a")
end

class B < Base
  assign_var("b")
end

class C < Base
  assign_var("c")
end

p A.show_var # "a"
p B.show_var # "b"
p C.show_var # "c"
a = A.new # nil
b = B.new # nil
c = C.new # nil

如果我使用Vu的解决方案,它不起作用。。。有什么想法吗?

类变量没有在子类中重新定义。在这种情况下,可以使用类级实例变量:

class Base
  @var = "base"

  def self.assign_var(var)
    @var = var
  end

  def self.show_var
    @var
  end
end

class A < Base
  assign_var("a")
end

class B < Base
  assign_var("b")
end

class C < Base
  assign_var("c")
end

p A.show_var # "a"
p B.show_var # "b"
p C.show_var # "c"
有关更多信息:
类变量在子类中没有重新定义。在这种情况下,可以使用类级实例变量:

class Base
  @var = "base"

  def self.assign_var(var)
    @var = var
  end

  def self.show_var
    @var
  end
end

class A < Base
  assign_var("a")
end

class B < Base
  assign_var("b")
end

class C < Base
  assign_var("c")
end

p A.show_var # "a"
p B.show_var # "b"
p C.show_var # "c"
有关更多信息:

请将以下内容视为对@Vu答案的延伸评论。他给出了一个很好的答案+1,但故意接近OP的代码。我只想指出,通常的方法是像Vu一样使用类实例变量和这些变量的访问器:

class Base
  @var = "base"
  class << self
    attr_accessor :var
  end
end

class A < Base
  @var = "a"
end

class B < Base
  self.var = "b"
end

Base.methods(false)      #=> [:var, :var=]
A.methods(false)         #=> []
A.methods.include?(:var) #=> true
A.method(:var=)          #=> #<Method: A(Base)
A.method(:var).owner     #=> #<Class:Base>

Base.instance_variables  #=> [:@var]
A.instance_variables     #=> [:@var]

Base.var #=> "base"
A.var    #=> "a"
B.var    #=> "b"
Base.var = 'cat'
Base.var #=> "cat"
A.var    #=> "a"

请将以下内容视为对@Vu回答的延伸评论。他给出了一个很好的答案+1,但故意接近OP的代码。我只想指出,通常的方法是像Vu一样使用类实例变量和这些变量的访问器:

class Base
  @var = "base"
  class << self
    attr_accessor :var
  end
end

class A < Base
  @var = "a"
end

class B < Base
  self.var = "b"
end

Base.methods(false)      #=> [:var, :var=]
A.methods(false)         #=> []
A.methods.include?(:var) #=> true
A.method(:var=)          #=> #<Method: A(Base)
A.method(:var).owner     #=> #<Class:Base>

Base.instance_variables  #=> [:@var]
A.instance_variables     #=> [:@var]

Base.var #=> "base"
A.var    #=> "a"
B.var    #=> "b"
Base.var = 'cat'
Base.var #=> "cat"
A.var    #=> "a"

有些文档将类变量@@称为类层次结构变量,因为出于这个原因。我从未见过一个使用类层次结构变量的好例子。我的经验法则是:不要使用它们。有些文档将类变量@称为类层次结构变量,因为出于这个原因。我从未见过一个使用类层次结构变量的好例子。我的经验法则是:不要使用它们。