我在很多方面对 Ruby 还很陌生,所以在尝试执行此操作时有点困难(通过模块?还是基类?)。
我想为类上执行的每个方法调用执行“puts”。类似于 cucumber 格式化程序的一个非常简单的形式,即:
class MyClass
def method_a
puts 'doing some stuff'
end
end
输出如下:
MyClass.new.method_a => 'methods_a', 'doing some stuff'
更重要的是,我希望它适用于任何类上的任何方法(动态地,不会乱七八糟我的代码)。我想应用一些格式,即“method_a”=>“Method A”。最好的方法是什么? AOP框架?
最佳答案
class MyClass
def method_a
puts "Doing A..."
end
def method_b
puts "Doing B..."
end
def self.call_before_all_methods
all_instance_methods = instance_methods - Class.instance_methods
all_instance_methods.each do |x|
class_eval <<-END
alias old_#{x} #{x}
def #{x}
print "\'#{x.to_s.split('_').each{|x| x.capitalize!}.join(' ')}\', "
old_#{x}
end
# remove_method old_#{x}.to_sym
END
end
end
private_class_method :call_before_all_methods
call_before_all_methods
end
a = MyClass.new
a.method_a
a.method_b
所以这里的技巧是先为每个方法创建一个别名,然后通过“打印格式化方法名称”+“作为别名的原始方法”重新定义该方法。它还由此处文档 (<<-END) 动态处理。
但是由于每个方法的重新定义都会调用其原始方法,因此最终无法remove_method或undef别名。我认为将所有这些别名 (old_method_a, old_method_b) 保留在那里并不是什么大问题。
关于ruby - 在所有方法调用之前执行代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12299219/