Sorbet 类型检查

Homebrew 中的大部分代码都是用动态语言 Ruby 编写的。为了利用静态类型检查的优势,我们在代码库中设置了 Sorbet,它为 Ruby 等动态语言提供了静态类型检查的优势。

如果您想深入了解 Sorbet 及其功能,Sorbet 文档 是一个不错的起点。

Homebrew 代码库中的 Sorbet

内联类型注释

sig 方法用于注释方法签名。这是一个简单的示例

class MyClass
  sig { params(name: String).returns(String) }
  def my_method(name)
    "Hello, #{name}!"
  end
end

使用 params,我们指定有一个参数 name,它必须是 String,而使用 returns,我们指定此方法始终返回 String

有关如何表达更复杂类型的更多信息,请参阅官方文档

Ruby 接口文件(.rbi

RBI 文件 帮助 Sorbet 了解常量、祖先和以它本机无法理解的方式定义的方法。我们还可以创建一个 RBI 文件来帮助 Sorbet 理解动态定义。

有时需要显式包含 Kernel 模块,以便 Sorbet 知道在给定上下文中可以使用 puts 等方法。这对于模块来说是必需的,因为它们既可以在 BasicObject(不包括 Kernel)中使用,也可以在 Object(默认情况下包括 Kernel)中使用。在这种情况下,有必要创建一个 .rbi 文件(示例),因为在实际代码中重新包含 Kernel 模块可能会破坏某些内容。

Library/Homebrew/sorbet 目录

使用 brew typecheck

在不带任何参数运行时,brew typecheck 将在考虑 Homebrew 核心代码库中每个 Ruby 文件中设置的严格级别的情况下运行。但是,当它在特定文件或目录上运行时,可能会出现更多错误,因为 Sorbet 无法解析指定文件范围之外定义的常量。这些问题可以用 RBI 文件解决。目前 brew typecheck 提供 --quiet--file--dir--ignore 选项,但你可以使用 srb tc --help 探索更多选项,并用 srb tc 传递它们。

解决类型错误

Sorbet 会报告类型错误以及错误参考代码,该代码可用于查找有关如何调试错误或导致错误的原因的更多信息,请参阅 Sorbet 文档。以下是调试一些常见类型错误的方法

Fork me on GitHub