ruby 动态添加类变量

Sib*_*ang 2 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 < 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"
Run Code Online (Sandbox Code Playgroud)

如何让他们表现出自己在班级中分配的价值?像这样:

p A.show_var # "a"
p B.show_var # "b"
p C.show_var # "c"
a = A.new # "a"
b = B.new # "b"
c = C.new # "c"
Run Code Online (Sandbox Code Playgroud)

更新

我需要在初始化程序中访问这个 var。

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
Run Code Online (Sandbox Code Playgroud)

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

小智 5

类变量不会在子类中重新定义。在这种情况下,您可以使用类级别的实例变量:

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"
Run Code Online (Sandbox Code Playgroud)

更多信息:http : //www.railstips.org/blog/archives/2006/11/18/class-and-instance-variables-in-ruby/