Почему Сорбет считает, что метод, для которого я предоставил явную подпись в файле RBI, не существует? - PullRequest
0 голосов
/ 04 октября 2019

Один из моих классов зависит от гем Geokit, который не предоставляет собственный файл RBI и не включен в репозиторий sorbet-typed. Я сам написал для него пару файлов RBI, включая сигнатуры методов, которые я использую в своем собственном коде.

Когда я пытаюсь изменить класс, который зависит от Geokit, на typed: true, он жалуется, чтометоды, которые я использую, не существуют.

Типы классов прекрасно проверяются в typed: false.

geokit.rbi

# typed: strong

module Geokit
end

bounds.rbi

# typed: strong

class Geokit::Bounds
    sig do
        params(
            thing: T.any(Geokit::Bounds, T::Array[T.any(T::Array[Numeric], Numeric, String)], String, Geokit::LatLng),
            other: T.nilable(T.any(T::Array[Numeric], String, Geokit::LatLng))
        ).returns(Geokit::Bounds)
    end
    def normalize(thing, other = nil); end
end

lib / platform / x.rb

class X
  BOUNDS = Geokit::Bounds.normalize([[0.8852118e2, -0.751305e1], [0.689324e2, -0.386637e1]])
end

Я получаю следующую ошибку:

lib/platform/x.rb:2: Method normalize does not exist on T.class_of(Geokit::Bounds) https://srb.help/7003
     2 |  BOUNDS = Geokit::Bounds.normalize([[0.8852118e2, -0.751305e1], [0.689324e2, -0.386637e1]])
                          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  Autocorrect: Use `-a` to autocorrect
    lib/platform/x.rb:2: Replace with initialize
     2 |  BOUNDS = Geokit::Bounds.normalize([[0.8852118e2, -0.751305e1], [0.689324e2, -0.386637e1]])

1 Ответ

1 голос
/ 04 октября 2019

Вы пропустили self. в определении RBI этого метода. Сорбет считает, что normalize - это метод экземпляра в Bounds.

# typed: strong

class Geokit::Bounds
    sig do
        params(
            thing: T.any(Geokit::Bounds, T::Array[T.any(T::Array[Numeric], Numeric, String)], String, Geokit::LatLng),
            other: T.nilable(T.any(T::Array[Numeric], String, Geokit::LatLng))
        ).returns(Geokit::Bounds)
    end
    def self.normalize(thing, other = nil); end
end
...