代码之家  ›  专栏  ›  技术社区  ›  Ben

ruby/能够在多个类之间共享单个变量

  •  0
  • Ben  · 技术社区  · 6 年前

    对于一般类操作的理解;

    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 回复  |  直到 6 年前
        1
  •  2
  •   3limin4t0r    6 年前

    我想你在找类变量。

    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 例外。

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