Ruby 3.1.2 kubuntu 22.04

从URL中提取基本域名(不包括子域名)的方法:

def host_name(a)
  URI(a).host.sub(/\Awww\./, '')
end

用途:

uri_array = ['https://www.example.org', 'http://www.example.net/posts?a=1', 'www.example.com']
uri_array.map!(&method(:host_name))

预期yields :=>

['example.org', 'example.net', 'example.com']

相反会产生:

(irb):14:in `host_name': undefined method `sub' for nil:NilClass (NoMethodError)

所得数组如下修改:

[
    [0] "example.org",
    [1] "example.net",
    [2] "www.example.com"
]

为什么它应该在数组的第三个元素上失败.

推荐答案

这里的问题不在于使用&method,而在于uri被传递给URI.当要解析的uri不包含方案(例如http、https等)时,URI将无法提取主机属性:

irb(main):001> require 'uri'
=> true
irb(main):002> uri = URI('www.example.com')
=> #<URI::Generic www.example.com>
irb(main):003> uri.host
=> nil
irb(main):004> uri.path
=> "www.example.com"
irb(main):005> uri.host.sub(/\Awww\./, '')
(irb):5:in `<main>': undefined method `sub' for nil (NoMethodError)

uri.host.sub(/\Awww\./, '')
        ^^^^
        from <internal:kernel>:187:in `loop'
        from /Users/jason/.gem/ruby/3.3.0/gems/irb-1.12.0/exe/irb:9:in `<top (required)>'
        from /Users/jason/.gem/ruby/3.3.0/bin/irb:25:in `load'
        from /Users/jason/.gem/ruby/3.3.0/bin/irb:25:in `<main>'
irb(main):006>

然而,您可以使用addressable gem,尤其是在这种情况下使用Addressable::URI.heuristic_parse.

将输入复制到URL.输入不一定是有效的URI -该方法将使用启发式来猜测URI的用途.这不符合标准,只是用户友好.

irb(main):001> require 'addressable'
=> true
irb(main):002> uri = Addressable::URI.heuristic_parse('www.example.com')
=> #<Addressable::URI:0x2ee0 URI:http://www.example.com>
irb(main):003> uri.host
=> "www.example.com"
irb(main):004>

Ruby相关问答推荐

当数据包含换行符时,Ruby PKCS7 无法验证

get.chomp() 与 STDIN.gets.chomp() 有什么区别?

`Range#include?` 和 `Range#cover?` 有什么区别?

如何在不将换行符粘贴到字符串中的情况下使用puts添加额外的换行符?

如何关闭 Rails 3.1 上的自动样式表/javascript 生成?

Ruby 连接字符串并添加空格

ruby 是否支持 case 语句中的范围?

Broken pipe (Errno::EPIPE)

Ruby 'require' 语句是在类定义的内部还是外部?

include_examples和it_behaves_like有什么区别?

如何在 Ruby 中找到除法的余数?

将Elastic search限制设置为无限制

对哈希中数组的值求和

如何在 jekyll markdown 博客中包含视频

如何在 Rails 3 迁移中描述枚举列?

使用哈希值呈现 ERB 模板

如何在 Ruby 中找到字符串中字符的索引?

如何在Ruby中将字符串拆分为仅具有给定字符的两部分?

在 Ruby 中解析制表符分隔文件的最佳方法是什么?

将浮点数舍入到Ruby中最接近的整数