You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 17:36:03