Ruby中如何在method_missing中正确执行代码以替代直接定义类方法
错误原因
你现有代码的核心问题有3个:
method_missing接收的method参数是Symbol类型,和字符串'select_things'直接比较永远匹配失败send方法的作用是调用指定名称的类/实例方法,第一个参数必须是方法名(字符串或Symbol),传入可执行代码字符串属于完全错误的用法args是调用方法时传入的参数数组,直接用整个数组和属性比较不符合原有逻辑,需要取出对应的参数值使用
正确实现
你这个场景完全不需要动态执行代码字符串,直接在方法名匹配后执行对应逻辑即可,同时建议配套实现respond_to_missing?保证respond_to?方法行为正常:
require_relative 'thing' class Someclass def self.method_missing(method, *args, &block) case method when :select_things things = load_things things.select { |thing| thing.some_property == args.first } when :tings load_things else # 不匹配的方法走默认的method_missing逻辑抛异常 super end end # 配套实现方法存在性校验逻辑 def self.respond_to_missing?(method, include_private = false) [:select_things, :tings].include?(method) || super end end
补充说明
如果你确实有动态执行代码字符串的需求(本场景完全不推荐,存在注入风险、性能差),可以使用eval方法执行代码字符串,写法如下:
# 仅做用法演示,本场景不要这么写 eval("things.select { |thing| thing.some_property == args[0] }")
内容的提问来源于stack exchange,提问作者James
相关产品推荐
相关产品推荐

