对象#方法和动态响应者

时间:2012-09-22 13:40:46

标签: ruby method-missing

我有一个名为User的Ruby对象(特别是一个ActiveRecord对象)。它响应find_by_idfind_by_auth_token等方法。但是,这些方法不是通过defdefine_method定义的。相反,它们是通过method_missing处理的动态方法。

我希望通过Object#method获取对这些方法之一的引用,例如:

User.method(:find_by_auth_token)

虽然这看起来不起作用。我提出的最佳解决方案是:

proc { |token| User.find_by_auth_token(token) }

还有其他方法可以使用这样的包装方法吗?我真的无法将Object#method用于动态方法吗?

1 个答案:

答案 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>