DEBUG.WIKI
京东云;让 AI 进入真实业务;零售 · 物流 · 客服 · 硬件;查看方案 →
ZgoCloud:多地区部署,按需选节点;日本、美国、香港、德国
Evoxt;最高 6.0GHz CPU;高频云服务器 · 免费每周备份;查看配置 →

RuboCop 把 Ruby 私有 runtime hook 判成未使用,保留隐式调用方法

Ruby 隐式调用的私有钩子没有普通引用点,可能被项目索引检查误报。RuboCop 1.90.0 保留这些入口,此检查的配置和索引条件仍需核对。

启用 RuboCop 的私有方法未使用检查后,inherited、const_missing 或 method_added 被标成没有引用,先确认这些方法是否由 Ruby 运行时隐式调用。项目中搜不到普通调用点,不等于方法没有作用。

例如,继承回调可以是私有类方法:

class Base
  class << self
    private

    def inherited(child)
      # 记录或注册新子类
    end
  end
end

class Child < Base
end

这段代码没有写 Base.inherited(Child),Ruby 仍会在创建子类时触发回调。基于显式引用名称索引判断“未使用”,如果没有保留这些运行时入口,就会给出错误诊断。其他隐式入口包括方法缺失处理、序列化钩子,以及类型转换相关方法;各自应依 Ruby 对应契约判断,不能把任意动态方法都视为保留项。

这里涉及 Lint/UnusedPrivateMethod 的项目索引路径。该 Cop 默认关闭,使用索引还需要 AllCops/UseProjectIndex 和 rubydex。未启用这一组合时,不应把普通未使用警告归因到此问题。实际故障材料没有披露原安装版本或操作系统,不能据此限定为某一平台才会发生。

RuboCop 1.90.0 的正式源码包含隐式调用方法集合,在收集可报告的私有方法时排除这些入口。更新已有工具依赖后检查最终解析版本:

bundle update rubocop
bundle exec rubocop --version
bundle exec rubocop --only Lint/UnusedPrivateMethod path/to/example.rb

暂不能更新时,可以在当前配置中关闭这条可选检查,保留方法,再由人工审查真正没有调用用途的私有方法:

Lint/UnusedPrivateMethod:
  Enabled: false

不要仅根据误报删除运行时钩子。该问题是诊断遗漏隐式入口,并不意味着 RuboCop 已自动删掉方法。

验收应同时放入一个真实隐式钩子和一个普通、确实未被引用的私有方法。前者应不再误报;如果仍启用索引检查,后者应继续接受正常分析。最后运行应用自身与该钩子有关的测试,确认回调行为。源码集合和上游回归测试能证明修补意图,但不能代替应用的运行验证,也不能给全部动态派发方法建立自动豁免。