在self.method_added中的define_method中设置类变量

时间:2013-12-23 19:49:52

标签: ruby

我想计算类中定义的新方法的方法调用。为此,我使用method_added钩子重新定义了每个新定义的方法。在其中,我使用define_method and increment the value of a class variable @@ test_count`。

基类:

class Unit
  @new_method = true
  @@test_count = 0

  def self.test_count
    puts @@test_count
  end

  def self.method_added(name)
    old_method = instance_method(name)
    if @new_method
      @new_method = false
      define_method(name) do |*args, &block|
        @@test_count += 1
        old_method.call(*args, &block)
      end
      @new_method = true
    end
  end
end

使用新定义的方法的子类:

class Test < Unit  
  def test_assertion
    puts true
  end
end

当我调用新方法时,@@test_count仍为0:

Test.new.test_assertion
Unit.test_count

true
0

为什么@@test_count值未更改?

1 个答案:

答案 0 :(得分:-1)

问题是由在类@new_method的主体中初始化类实例变量Unit引起的。当我使用Test为此类创建子类时,此变量未在子类Test中初始化。没有想法为什么会这样,但我通过将if更改为unless来解决问题,从而使用未初始化变量中的nil来传递检查,然后为其分配适当的值:

class Unit
  @@test_count = 0

  def self.method_added(name)
     unless @new_method
      @new_method = true
      old_method = instance_method(name)
      define_method(name) do |*args, &block|
        @@test_count += 1
        old_method.bind(self).call(*args, &block)
      end
      @new_method = false
    end
  end
end

为什么类实例变量初始化没有被继承&#34;在子类中?