我正在使用一些元编程(使用ruby 2.3.1),这样我就可以在调用我想调用的实际方法之前调用一个方法 - 比如before_filter / before_action。
下面的伪代码解释了我想要实现的目标
module Api
def call_this_method_everytime
if A
go ahead and call the actual method being called
else
stop here do not call he method it was supposed to call
end
end
def when_i_call_this_method
end
def or_this_method
end
end
在SO成员的帮助下,我能够理论上理解我想要使用元编程做什么 - 我在下面的代码中得到了。
module Api
def heartbeat
...
end
def interceptor(name)
original_method = "original #{name}"
alias_method original_method, name
define_method(name) do |*args|
heartbeat
result = send original_method, *args
puts "The method #{name} called!"
result
end
end
end
而不是调用我想要的方法 - 我使用我想要作为参数调用的实际函数的名称来调用拦截器方法。然后我会先调用heartbeat
函数,如果检查没问题,那么我继续实际调用实际函数。
但是对元编程的了解有限,我收到了这个错误
NoMethodError: undefined method 'alias_method'
搜索周围没有帮助。任何帮助表示赞赏。
答案 0 :(得分:1)
做同样事情的简单方法:
def interceptor(name, *args)
if 1 == 1
send name, args
end
end
interceptor(:puts, "oi")