Sorbet 覆盖来自内核的 URI

Sorbet overrides URI from Kernel

我有如下方法

  sig do
    params(uri: URI).returns(String)
  end
  def get(uri)
    http = Net::HTTP.new(uri.host, uri.port)
    http.use_ssl = true
    http.start
    response = http.request_get(uri.path)
    response.body
  ensure
    http&.finish
  end

测试方法如下(不使用sorbet)

def test_get_retry
    uri = URI('http://localhost:4567')
    instance = BookStoreHttpClient.new
    begin
      instance.get_with_retry(uri)
    rescue StandardError
      assert(true)
    end
end

但是 Sorbet 抱怨“方法 hostURI 上不存在”,但它实际上是一个内核 class。

有没有办法告诉 Sorbet 在 sorbet/rbi/hidden-definitions/hidden.rbi

中使用 Kernel::URI 而不是 URI

Sorbet 是对的,问题不是用错了URI

URI 不是类型,它是一个包含类型的模块:URI::GenericURI::HTTPS 等。Kernel::URI 也不是类型,它是一个函数returns URI 模块中包含的一种类型的实例。

例如:

URI("google.com") # => #<URI::Generic google.com>
URI("https://www.google.com") # => #<URI::HTTPS https://www.google.com>

您应该指定所需的 URI 类型,例如:

params(uri: URI::HTTPS).returns(String)

或者选择一个子集并使用联合类型:

params(uri: T.any(URI::HTTP, URI::HTTPS)).returns(String)