[英]Require Elem when using Sorbet RBI
我想用新的实例方法扩展标准Array
,但我不断收到有关未找到type_member
的运行时错误。
定义看起来像这样。
class Array
extend T::Sig
extend T::Generic
sig do
type_parameters(:U)
.params(split_elem: T.type_parameter(:U))
.returns(T::Array[Elem])
end
def split_on(split_elem)
output = []
group = []
each do |elem|
if elem.eql?(split_elem)
output << group unless group.empty?
group = []
else
group << elem
end
end
output << group unless group.empty?
output
end
end
有没有办法明确要求声明Elem
的rbi 文件?
尝试运行代码时,出现以下错误。 我试过要求sorbet-runtime
但到目前为止没有成功。
NameError: uninitialized constant Array::Elem
.returns(T::Array[Elem])
RBI 文件是纯粹的静态工件,它们并不意味着需要或以任何方式运行。 因此,对您的问题的高级回答是“不,您不能要求 RBI 文件”。
您面临的问题是您正在添加一个可静态检查的签名(即Elem
可以理解Elem
并在不运行代码的情况下对您的代码进行类型检查),但它在运行时无效,因为在Ruby Array
类。
有两种方法可以平方这个圆:
Array#split_on
的内联签名移动到 RBI 文件,这将使签名仅静态检查(基于我上面所说的关于 RBI 文件的内容),或者T::Sig::WithoutRuntime.sig
而不是sig
来编写您的签名,如此处所述。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.