我在调整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
答案 0 :(得分:3)
此代码设置一个默认值,该值在访问不存在的密钥时返回。
在这种特定情况下,如果给定的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"
关于块参数命名:
您可以将您想要的第一个参数命名为,但有些开发人员喜欢命名一个未使用的块运算符_
。这种方式乍一看很清楚,你不关心这个参数。
答案 1 :(得分:2)
[key] if /^\d+$/ === key
是default_proc。如果密钥在散列中找不到 ,则每次运行。如果“123”不是现有密钥,ALIASES["123"]
将返回["123"]
。
答案 2 :(得分:0)
请查看Hash :: new文档here。它说:
返回一个新的空哈希。如果随后通过与散列条目不对应的键访问此散列,则返回的值取决于用于创建散列的新样式。如果指定了一个块,它将使用哈希对象和键调用,并应返回默认值。
所以“_”是被设置对象的值,而作者并不关心它。中间行仅检查键是否仅包含数字,如果不包含,则将键值分配给具有此键值的数组。如果密钥只包含数字,则忽略它。
对于Regexp#=〜,Ruby的Regexp#===是just an alias。只是一个注释 - 这是一段可怕的,难以理解的代码。仅仅因为你可以写出这样的东西并不意味着你应该这样做。请不要受到启发。
答案 3 :(得分:0)
以下摘自Ruby documentation for Hash::new:
如果指定了obj,则此单个对象将用于所有默认值。如果指定了一个块,它将使用哈希对象和键调用,并应返回默认值。如果需要,该块负责将值存储在哈希值中。
在您的情况下,它是一个块,它定义了在找不到密钥时将返回的默认值。在这种情况下,只有当键与正则表达式/^\d+$/
匹配时它才会返回它,而[key]
表示它将在数组内返回。