我刚开始玩冰糕宝石。我有一个期望并返回对象数组的方法。问题是,数组的长度是变化的。如何键入检查方法?我不断得到Expected type [Object], got array of size 2
这是我的方法
sig { params(foo: Array[Object]).returns(Array[Object]) }
def bar(foo)
# code to modify some of the attributes
end
tl; dr您有语法错误。使用T::Array[Object]
(不是Array[Object]
)。
您对数组使用了不正确的类型语法:
# typed: strict
extend T::Sig
sig { params(foo: Array[Object]).returns(Array[Object]) }
def bar(foo)
# code to modify some of the attributes
end
错误显示:
editor.rb:5: Use T::Array[...], not Array[...] to declare a typed Array https://srb.help/5026
5 |sig { params(foo: Array[Object]).returns(Array[Object]) }
^^^^^^^^^^^^^
Note:
Array[...] will raise at runtime because this generic was defined in the standard library
Autocorrect: Use `-a` to autocorrect
editor.rb:5: Replace with T::Array
5 |sig { params(foo: Array[Object]).returns(Array[Object]) }
^^^^^
editor.rb:5: Use T::Array[...], not Array[...] to declare a typed Array https://srb.help/5026
5 |sig { params(foo: Array[Object]).returns(Array[Object]) }
^^^^^^^^^^^^^
Note:
Array[...] will raise at runtime because this generic was defined in the standard library
Autocorrect: Use `-a` to autocorrect
editor.rb:5: Replace with T::Array
5 |sig { params(foo: Array[Object]).returns(Array[Object]) }
^^^^^
Errors: 2
为什么会这样?
[]
on 方法具有特殊含义,Array
但 Sorbet[]
用于泛型类型参数。为了解决这个问题,Sorbet 使用T::
标准库中某些泛型类的命名空间:
→ https://sorbet.org/docs/stdlib-generics
在你的情况下发生的是这段代码:
Array[Object]
相当于写了这个:
[Object]
(即,“制作一个长度为 1 的数组,其中包含值Object
”)。[Object]
在 Sorbet 中恰好是表达 a 的方式1-tuple
。