【问题标题】:Sorbet cannot resolve constant even though it is defined即使定义了 Sorbet 也无法解析常量
【发布时间】:2020-12-07 23:51:04
【问题描述】:

给定:

# typed: true

module X
  class Y
  end
end

module X
  class X
    def y
      X::Y
    end
  end
end

冰糕给出错误:

editor.rb:6: Unable to resolve constant Y https://srb.help/5002
     6 |      X::Y

为什么即使定义了 X::Y 也会出现错误?

Playground link

【问题讨论】:

    标签: ruby sorbet


    【解决方案1】:

    因为这就是 ruby​​ 中常量查找的工作方式。粗略地说,它尝试从最里面的嵌套开始解析名称。因此,在您的 X::Y 中,它会将 X 解析为 class X,而 class X 没有 Y

    改用::X::Y,强制从顶层查找。

    【讨论】:

    • 换句话说:如果你运行代码,你会得到完全相同的错误,而像 Sorbet 这样的类型检查器的全部意义在于在你运行代码之前给你这些错误。或者,更直接地说:“为什么即使定义了 X::Y,冰糕也会出错?” ——因为不是。
    • 正如其他人所说,这是您的代码在运行时的行为:::X::X.new.y #=> NameError: uninitialized constant X::X::Y
    • 我对这种行为感到困惑,因为在我使用的 Rails 应用程序中,它在运行时不会导致错误。事实证明,由于 ActiveSupport 解决了该问题,因此没有发生持续丢失。谢谢你的回答:)
    猜你喜欢
    • 1970-01-01
    • 2014-01-13
    • 2022-01-26
    • 1970-01-01
    • 2012-08-18
    • 1970-01-01
    • 2021-06-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多