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 抱怨“方法 host
在 URI
上不存在”,但它实际上是一个内核 class。
有没有办法告诉 Sorbet 在 sorbet/rbi/hidden-definitions/hidden.rbi
中使用 Kernel::URI 而不是 URI
Sorbet 是对的,问题不是用错了URI
。
URI
不是类型,它是一个包含类型的模块:URI::Generic
、URI::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)
我有如下方法
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 抱怨“方法 host
在 URI
上不存在”,但它实际上是一个内核 class。
有没有办法告诉 Sorbet 在 sorbet/rbi/hidden-definitions/hidden.rbi
Sorbet 是对的,问题不是用错了URI
。
URI
不是类型,它是一个包含类型的模块:URI::Generic
、URI::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)