将对象传递给Hash.new时的含义是什么

时间:2012-12-03 16:26:19

标签: ruby object hash

我在调整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

4 个答案:

答案 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+$/ === keydefault_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]表示它将在数组内返回。