5

我有一个名为User. 它响应 , 等方法find_by_idfind_by_auth_token但是,这些不是通过defor定义的方法define_method。相反,它们是通过 处理的动态方法method_missing

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

User.method(:find_by_auth_token)

不过看起来这行不通。我想出的最佳解决方案是:

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

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

4

1 回答 1

5

最简单的答案是“否”——通常保证Object#method(:foo)返回实例的唯一方法Method是定义foo在对象上命名的方法。

更复杂的答案是,您可以通过在给定时覆盖它返回的 st来强制Object#method(:foo)返回一个实例。例如:MethodObject#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>

(由您确保实际定义了该方法):

m.call
# => NoMethodError: undefined method `find_by_hackish_means' for #<User:0x123>
于 2012-09-22T14:59:35.903 回答