对于一般类的操纵理解; 给出以下用例:
class Child1
def process var
'child1' + var
end
end
class Child2
def process var
'child1' + var
end
end
class Child3
def process var
'child3' + var
end
end
...
class Master
attr_reader :var
def initialize(var)
@var = var
end
def process
[
Child1.new.process(var),
Child2.new.process(var),
Child3.new.process(var)
]
end
end
通过某种继承或结构,是否有办法让所有孩子都可以使用var
?
含义:
class Child1 < Inherited
def process
'child1' + var
end
end
...
class Master
...
def process
[
Child1.new.process,
...
]
end
end
我不太了解我所能找到的首选方法(尽管上面的第一个示例可以正常工作,虽然可能不是最优雅的方法);感谢您的指导
答案 0 :(得分:2)
我认为您正在寻找类变量。
Class Variables
Class变量在类,其子类及其实例之间共享。
类变量必须以
@@
(两个“ at”符号)开头。名称的其余部分遵循与实例变量相同的规则。这里是一个例子:
class A @@class_variable = 0 def value @@class_variable end def update @@class_variable = @@class_variable + 1 end end class B < A def update @@class_variable = @@class_variable + 2 end end a = A.new b = B.new puts "A value: #{a.value}" puts "B value: #{b.value}"
此打印:
A value: 0 B value: 0
继续同一示例,我们可以使用任一类中的对象进行更新,并且共享值:
puts "update A" a.update puts "A value: #{a.value}" puts "B value: #{b.value}" puts "update B" b.update puts "A value: #{a.value}" puts "B value: #{b.value}" puts "update A" a.update puts "A value: #{a.value}" puts "B value: #{b.value}"
此打印:
update A A value: 1 B value: 1 update B A value: 3 B value: 3 update A A value: 4 B value: 4
访问未初始化的类变量将引发NameError异常。
请注意,类具有实例变量,因为类是对象,因此请不要混淆类和实例变量。