【发布时间】:2019-11-04 16:04:15
【问题描述】:
如何使用 sorbet 指定类型参数?
例如,我想使用返回泛型类型T[A] 的A 类型的参数来注释一个方法。
def build_array(value)
[value]
end
输出类型取决于输入类型:
build_array(42) #=> return Array[Integer]
build_array('42') #=> return Array[String]
【问题讨论】:
如何使用 sorbet 指定类型参数?
例如,我想使用返回泛型类型T[A] 的A 类型的参数来注释一个方法。
def build_array(value)
[value]
end
输出类型取决于输入类型:
build_array(42) #=> return Array[Integer]
build_array('42') #=> return Array[String]
【问题讨论】:
您可以尝试使用 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的示例
【讨论】:
您可以使用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]
【讨论】: