红宝石/在多个类之间共享单个变量的能力

时间:2018-09-29 17:18:04

标签: ruby class variables inheritance

对于一般类的操纵理解; 给出以下用例:

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

我不太了解我所能找到的首选方法(尽管上面的第一个示例可以正常工作,虽然可能不是最优雅的方法);感谢您的指导

1 个答案:

答案 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异常。

     

请注意,类具有实例变量,因为类是对象,因此请不要混淆类和实例变量。