我有一个名为User
的Ruby对象(特别是一个ActiveRecord对象)。它响应find_by_id
,find_by_auth_token
等方法。但是,这些方法不是通过def
或define_method
定义的。相反,它们是通过method_missing
处理的动态方法。
我希望通过Object#method
获取对这些方法之一的引用,例如:
User.method(:find_by_auth_token)
虽然这看起来不起作用。我提出的最佳解决方案是:
proc { |token| User.find_by_auth_token(token) }
还有其他方法可以使用这样的包装方法吗?我真的无法将Object#method
用于动态方法吗?
答案 0 :(得分:5)
最简单的答案是“不” - 保证一般的唯一方法Object#method(:foo)
将返回Method
的实例是通过定义名为{{1的方法在对象上。
答案越多,您可以通过覆盖foo
s.t强制Object#method(:foo)
强制返回Method
的实例。在给定Object#respond_to_missing?
时,它会返回true
。例如:
:foo
(由您来确保实际定义了该方法):
class User
def respond_to_missing?(method_name, include_private = false)
method_name.to_s.start_with?('find_by_')
end
end
m = User.new.method(:find_by_hackish_means)
# => #<Method: User#find_by_hackish_means>