Почему для проверки типа Sorbet требуются как sig, так и T.let?

Я установил свой файл как 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 по подписи?


person tlehman    schedule 09.08.2019    source источник


Ответы (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;DR:

[Sorbet] не может повторно использовать знание статического типа для автоматического определения типа экземпляра или переменной класса.

Об этом также сообщалось в #1666. Кажущаяся ненужной аннотация типов переменных экземпляра

person marianosimone    schedule 04.09.2019