我在调整 时遇到了这段代码ghi
,我无法弄清楚将对象传递给对象的含义ALIASES
。任何人都可以帮助解释[key] if /^\d+$/ === key
以下代码中的行吗?
ALIASES = Hash.new { |_, key|
[key] if /^\d+$/ === key
}.update({...})
https://github.com/yangchenyun/ghi/blob/reading/lib/ghi.rb#L119-138
我在调整 时遇到了这段代码ghi
,我无法弄清楚将对象传递给对象的含义ALIASES
。任何人都可以帮助解释[key] if /^\d+$/ === key
以下代码中的行吗?
ALIASES = Hash.new { |_, key|
[key] if /^\d+$/ === key
}.update({...})
https://github.com/yangchenyun/ghi/blob/reading/lib/ghi.rb#L119-138
此代码设置默认值,当访问不存在的键时返回该值。
在这种特定情况下,如果给定是整数的表示,则默认设置为key
在中返回给定。Array
key
String
hash = Hash.new do |_, key|
[key] if /^\d+$/ === key
end
hash["foo"].inspect # => nil
hash[123].inspect # => nil
hash["123"].inspect # => ["123"]
正则表达式匹配的一些示例:
/^\d+$/ === 123 # => false
/^\d+$/ === "a123" # => false
/^\d+$/ === "123a" # => false
/^\d+$/ === "1.23" # => false
/^\d+$/ === "123" # => true
另一个(更简单的)默认值示例:
hash = Hash.new { |_, key| "this key does not exist" }
hash["foo"] # => "this key does not exist"
hash["foo"] = "bar"
hash["foo"] # => "bar"
关于块参数命名:您可以将第一个参数命名为您喜欢的任何名称,但一些开发人员喜欢命名未使用的块运算符_
。这样一目了然,你并不关心这个参数。
这[key] if /^\d+$/ === key
是default_proc。每次在哈希中找不到密钥时它都会运行。如果“123”不是现有键,ALIASES["123"]
将返回。["123"]
请在此处查看 Hash::new 文档。它说:
返回一个新的空哈希。如果此哈希随后被不对应于哈希条目的键访问,则返回的值取决于用于创建哈希的 new 的样式。如果指定了一个块,它将使用哈希对象和键调用,并且应该返回默认值。
所以“_”是被设置对象的值,作者并不关心。中间行只检查 key 是否仅包含数字,如果不是,则将 key value 分配给具有此 key value 的数组。如果密钥仅包含数字,则忽略它。
Ruby 的 Regexp#===只是 Regexp#=~ 的别名。
请注意——这是一段可怕的、难以阅读的代码。仅仅因为你可以写这样的东西并不意味着你应该这样做。请不要受到启发。
如果指定了 obj,则此单个对象将用于所有默认值。如果指定了一个块,它将使用哈希对象和键调用,并且应该返回默认值。如果需要,将值存储在散列中是块的责任。
在您的情况下,它是一个块,它定义了一个在找不到键时将返回的默认值。在这种情况下,仅当键与给定的正则表达式匹配时才会返回它/^\d+$/
,[key]
这意味着它将在数组中返回。