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