我維護著pdf-reader ruby gem,我用它來試驗冰糕。我以前沒有使用冰糕的經驗。
我想使用型別來改善開發體驗,并將型別資訊與 gem 一起分發,以便使用冰糕的下游用戶可以受益。但是,我想避免添加運行時冰糕依賴項。大多數下游用戶不使用冰糕,他們不應該獲得新的運行時依賴。
我認為這意味著我應該在頂級rbi/目錄中將型別資訊作為 *.rbi 檔案分發。我無法將型別行內到我的源(extend T::Sig等)中。
在開發(和測驗/ci)期間,型別資訊rbi/*.rbi對于靜態型別檢查很有用。但是,我不能依賴運行時正確的型別(下游用戶可能會傳遞不同的型別),因此在某些情況下,我仍然想像這樣確認型別:
def initialize(runs, mediabox)
raise ArgumentError, "a mediabox must be provided" if mediabox.nil?
...即使我的 rbi 檔案宣告 mediabox 永遠不會為零:
sig { params(runs: T::Array[PDF::Reader::TextRun], mediabox: T::Array[Numeric]).void }
def initialize(runs, mediabox); end
.. 但是冰糕對代碼不滿意:
$ srb tc
./lib/pdf/reader/page_layout.rb:20: This code is unreachable https://srb.help/7006
20 | raise ArgumentError, "a mediabox must be provided" if mediabox.nil?
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
./lib/pdf/reader/page_layout.rb:20: This condition was always falsy (T::Boolean)
20 | raise ArgumentError, "a mediabox must be provided" if mediabox.nil?
^^^^^^^^^^^^^
Got T::Boolean originating from:
./lib/pdf/reader/page_layout.rb:20:
20 | raise ArgumentError, "a mediabox must be provided" if mediabox.nil?
^^^^^^^^^^^^^
Errors: 1
我可以明確忽略該錯誤:
$ srb tc --suppress-error-code 7006
No errors! Great job.
有沒有辦法保持運行時型別檢查而不會抱怨冰糕,也不會忽略錯誤?或者也許“冰糕方式”只是洗掉運行時檢查并在運行時沒有它?
或者我關于只使用 rbi 檔案作為型別資訊的假設是錯誤的?
uj5u.com熱心網友回復:
添加輔助驗證方法:
sig { params(obj: Object, cls: Module).void }
def self.validate(object, cls)
raise ArgumentError, "#{obj} must be a #{cls}" unless obj.is_a?(cls)
end
現在,您可以在整個代碼中驗證型別,而無需添加冰糕運行時依賴項。
您當然也可以引入變體,例如validate_not_null(對于上面的特定示例)。對于特定于冰糕的型別(例如 )T::Array,它確實有點棘手,具體取決于您希望驗證的嚴格程度。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/362100.html
上一篇:如何在MySQL中執行半連接?
下一篇:Puma初始化后不會繼續監聽
