Как указать тип параметра - PullRequest
1 голос
/ 21 июня 2019

Как указать параметр типа с помощью сорбета?

Например, я хочу аннотировать метод с аргументом типа A, возвращая универсальный тип T[A].

def build_array(value) 
  [value]
end

Тип вывода зависит от типа ввода:

build_array(42) #=> return Array[Integer]
build_array('42') #=> return Array[String]

Ответы [ 2 ]

3 голосов
/ 21 июня 2019

Вы можете сделать это, используя type_parameters:

# typed: true
extend T::Sig

sig do
  type_parameters(:T)
  .params(value: T.type_parameter(:T))
  .returns(T::Array[T.type_parameter(:T)])
end
def build_array(value) 
  [value]
end

x = build_array(5)
T.reveal_type(build_array(42))   # T::Array[Integer]
T.reveal_type(build_array('42')) # T::Array[String]

Вот ссылка sorbet.run с кодом выше .

1 голос
/ 21 июня 2019

Вы можете попробовать использовать Generic для определения метода.

Например:

  sig do
    type_parameters(:U)
    .params(
      blk: T.proc.params(arg0: Elem).returns(T.type_parameter(:U)),
    )
    .returns(Box[T.type_parameter(:U)])
  end
  def map(&blk)
    Box.new(blk.call(@x))
  end

См. Пример из sorbet.run

...