我正在查看Sorbet运行时错误从医生那里的列表。在我看来,“来自无效sig procs的错误”和“来自无效sigs的错误”将被Sorbet类型检查器捕获。如果您的代码通过了Sorbet的静态检查,是否保证这些运行时错误永远不会发生?
发布于 2022-01-28 20:57:31
基本答案
在有些情况下,静态检查会通过,但是您会得到一个运行时错误。请考虑以下几点:
# typed: strict
class A
extend T::Sig
sig {returns(Integer)}
def foo; 0; end
end
class B < A
sig {returns(String)}
def foo; '0'; end
end
B.new.foo运行此程序将以以下方式结束:
RuntimeError: Incompatible return type in signature for override of method `foo`额外的
通过确保在适当的时候在签名中使用overridable或(:final) (文档),可以避免陷入这种情况。
class A
extend T::Sig
sig {overridable.returns(Integer)}
def foo; 0; end
sig (:final) {returns(Integer)}
def bar; 0; end
end
class B < A
sig {returns(String)} # this will fail static check, as it doesn't declare `override`
def foo; '0'; end
sig {returns(String)} # this will fail static check, as `bar` is `final`
def bar; '0'; end
endhttps://stackoverflow.com/questions/70791202
复制相似问题