繁体   English   中英

使用 Sorbet RBI 时需要 Elem

[英]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

有没有办法明确要求声明Elemrbi 文件

尝试运行代码时,出现以下错误。 我试过要求sorbet-runtime但到目前为止没有成功。

NameError: uninitialized constant Array::Elem

      .returns(T::Array[Elem])

RBI 文件是纯粹的静态工件,它们并不意味着需要或以任何方式运行。 因此,对您的问题的高级回答是“不,您不能要求 RBI 文件”。

您面临的问题是您正在添加一个可静态检查的签名(即Elem可以理解Elem并在不运行代码的情况下对您的代码进行类型检查),但它在运行时无效,因为在Ruby Array类。

有两种方法可以平方这个圆:

  1. 您可以将Array#split_on的内联签名移动到 RBI 文件,这将使签名仅静态检查(基于我上面所说的关于 RBI 文件的内容),或者
  2. 您可以使用T::Sig::WithoutRuntime.sig而不是sig来编写您的签名,如此所述。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM