1

我将我的文件设置为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从签名中推断出类型吗?

4

1 回答 1

1

编辑:从 2019-12 开始,情况不再如此(参见PR #2230)。现在这段代码完全有效(注意构造函数的签名声明void为返回类型):

# typed: strict
class Point
  extend T::Sig

  sig { params(c: T::Array[Float]).void }
  def initialize(c)
    @c = c # Sorbet knows that c is a `T::Array[Float]`, so it assigns that type to @c
  end
end

之前:

这是 Sorbet 中的一个已知限制:“为什么我需要从构造函数中重复类型?

TL;博士:

[Sorbet] 不能重用静态类型知识来自动确定实例或类变量的类型。

#1666 中也有报道,实例变量的看似不必要的类型注释

于 2019-09-04T21:53:49.123 回答