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]无法重用静态类型知识来自动确定实例或类变量的类型

报告中也提到了这一点