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