【问题标题】:Sorbet fails when using creating an instance of an autoloaded class in rails initializer在 Rails 初始化程序中使用创建自动加载类的实例时,Sorbet 失败
【发布时间】:2026-02-19 09:05:03
【问题描述】:

在使用 sorbet 的 rails 应用程序中,当您有一个需要类型实例的方法时,例如 Foo。您需要在应用程序的初始化程序中初始化Foo 的实例,该应用程序在请求之间持续存在于内存中。然后您对Foo 的源代码或Foo 使用的任何文件进行任何更改。那么 sorbet 认为这个实例不再是Foo 的实例,你需要重启你的应用才能让它停止报错。

这似乎是一种罕见的情况,但在我们的应用程序中,我们使用了一些依赖注入,而且这是一个庞大的团队。因此,几乎每次我们进行 git 更新时,sorbet 都会让我们重新启动我们的应用程序,并且在我们编写代码的一天中很多次。我们有一个大型应用程序需要一段时间才能重新启动,不得不这样做非常令人沮丧。

关于如何解决这个问题的任何想法?如果有帮助,我可以制作一个示例 rails 应用程序来演示此行为。

【问题讨论】:

    标签: sorbet


    【解决方案1】:

    当我在 Rails 初始化程序中引用模型时,我自己也遇到了类似的问题。我被告知有两种解决方案:

    1. 重构代码,以免出现此问题
    2. checked(:tests)checked(:never) 添加到存在此问题的方法的信号中。这将保留运行时和测试时间检查,但消除开发中的错误。有关文档,请参阅下面的链接

    https://sorbet.org/docs/runtime#checked-whether-to-check-in-the-first-place

    【讨论】: