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处理的动态方法.
我想通过 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> (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |