我想计算类中定义的新方法的方法调用。为此,我使用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
值未更改?
答案 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;在子类中?