冰糕可变数组长度

Sorbet variable array length

我刚开始玩冰糕gem。我有一个方法需要 returns 一个对象数组。问题是,数组的长度是变化的。我如何输入检查方法?我不断收到 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

→ View on sorbet.run

错误显示:

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

为什么会这样?

Array 上的 [] 方法具有特殊含义,但 Sorbet 使用 [] 作为泛型参数。为了解决这个问题,Sorbet 对标准库中的某些通用 类 使用 T:: 命名空间:

https://sorbet.org/docs/stdlib-generics

你的情况是这段代码:

Array[Object]

相当于这样写:

[Object]

(即“创建一个包含值 Object 的长度为 1 的数组”)。 [Object] 在 Sorbet 中恰好是表达 1-tuple 的方式。