如果参数是数组,Sorbet 不会检查参数的运行时类型



我有以下代码,您可以将其复制粘贴到本地,并将其作为单个文件运行:


require 'bundler/inline'
gemfile do
source 'https://rubygems.org'
gem 'sorbet-runtime'
end
require 'sorbet-runtime'

class Numbers
extend T::Sig
sig { params(a: Integer, b: Integer).returns(Integer) }
def sum_of_two(a, b)
a + b
end
sig { params(values: T::Array[Integer]).returns(Integer) }
def sum_of_array(values)
values.sum
end
end

如果我在文件末尾添加以下行,我将得到以下结果

Numbers.new.sum_of_two(1, 2) # => does not fail because the actual args are ints
# Numbers.new.sum_of_two(1.0, 2) # => raises errors because one of the param is Float
Numbers.new.sum_of_array([1, 2, 3]) #=> ok, because everything matches
Numbers.new.sum_of_array([1.0, 2, 3]) #=> raises only an error when tries to match the return type
请问,谁能给我解释一下它为什么会这样?如果类型是数组,为什么不在运行时验证类型?

文档中讨论了这种确切的情况:

Sorbet在运行时完全擦除泛型参数。当Sorbet看到像T::Array[Integer]这样的签名时,在运行时它只会检查参数是否具有Array类,但不检查该数组的每个元素在运行时是否也是Integer类。

最新更新