Ruby 为什么冰糕需要sig和T.let进行型式检查?
我将我的文件设置为Ruby 为什么冰糕需要sig和T.let进行型式检查?,ruby,sorbet,Ruby,Sorbet,我将我的文件设置为typed:strict,并将我的initialize方法设置为接受浮点数组,但srb tc报告我必须在方法体中使用T.let断言: # typed: strict class Point extend T::Sig sig { params(c: T::Array[Float]).returns(t::Array[Float]) } def initialize(c) @c = c end end Sorbet不能从签名推断出@c的类型吗?编辑:从
typed:strict
,并将我的initialize
方法设置为接受浮点数组,但srb tc
报告我必须在方法体中使用T.let
断言:
# typed: strict
class Point
extend T::Sig
sig { params(c: T::Array[Float]).returns(t::Array[Float]) }
def initialize(c)
@c = c
end
end
Sorbet不能从签名推断出
@c
的类型吗?编辑:从2019-2012年起,情况不再如此(请参阅)。现在,此代码完全有效(请注意,构造函数的签名将void
声明为返回类型):
#键入:严格
类点
扩展T::Sig
sig{params(c:T::Array[Float]).void}
def初始化(c)
@c=c#Sorbet知道c是一个'T::Array[Float]`,因此它将该类型分配给@c
结束
结束
以前:
这是冰糕的一个已知局限性:“
TL;博士:
[Sorbet]无法重用静态类型知识来自动确定实例或类变量的类型
报告中也提到了这一点