加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby – 对象#方法和动态响应器

发布时间:2020-12-17 03:14:52 所属栏目:百科 来源:网络整理
导读:我有一个名为User的 Ruby对象(特别是一个ActiveRecord对象).它响应find_by_id,find_by_auth_token等方法.但是,这些不是通过def或define_method定义的方法.相反,它们是通过method_missing处理的动态方法. 我想通过 Object#method 获得对这些方法之一的引用,例
我有一个名为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#方法用于动态方法吗?

解决方法

最简单的答案是“不” – 通常只保证Object#方法(:foo)将返回Method的一个实例的唯一方法是在对象上定义一个名为foo的方法.

更复杂的答案是你可以强制Object#method(:foo)通过重写Object #response_to_missing来返回Method的一个实例? S.T.给出时它返回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>

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读