我有以下代码:
module A
def my_method
puts self.instance_methods.include?(:my_base_method)
end
end
class B
extend A
my_method
def my_base_method
end
end
打印false,因为该方法在定义方法my_base_method
之前执行。我可以通过移动执行直到my_base_method
被定义
class B
extend A
def my_base_method
end
my_method
end
但是在我的代码中,我理想地希望my_method
在类的顶部被调用,以达到美观的目的。有没有办法做到这一点,而没有在类扩展模块结束时调用my_method
?
这里有一些你可以利用的东西:我如何在Ruby类定义的末尾设置一个钩子来运行代码?
例如,您可以这样利用它:
module A
def self.extended(obj)
TracePoint.trace(:end) do |t|
if obj == t.self
validation_was_called = obj.instance_variable_defined?(:@_validation_ready)
obj.instance_variable_set(:@_validation_ready, true)
obj.validate_interface if validation_was_called
end
end
end
def validate_interface
@_validation_ready ||= false
puts "validation ready for #{name} ? #{@_validation_ready}"
puts "Class #{name}: #{self.instance_methods.include?(:my_base_method) ? "OK" : "KO" }" if @_validation_ready
end
end
class B
extend A
validate_interface
def my_base_method
end
end
class C
extend A
validate_interface
end
输出:
> validation ready for B ? false
> validation ready for B ? true
> Class B: OK
> validation ready for C ? false
> validation ready for C ? true
> Class C: KO