0

我在调整 时遇到了这段代码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

4 回答 4

3

此代码设置默认值,当访问不存在的键时返回该值。

在这种特定情况下,如果给定是整数的表示,则默认设置为key在中返回给定。ArraykeyString

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"

关于块参数命名:您可以将第一个参数命名为您喜欢的任何名称,但一些开发人员喜欢命名未使用的块运算符_。这样一目了然,你并不关心这个参数。

于 2012-12-03T16:42:24.593 回答
2

[key] if /^\d+$/ === keydefault_proc。每次在哈希中找不到密钥时它都会运行。如果“123”不是现有键,ALIASES["123"]将返回。["123"]

于 2012-12-03T16:41:06.697 回答
0

请在此处查看 Hash::new 文档。它说:

返回一个新的空哈希。如果此哈希随后被不对应于哈希条目的键访问,则返回的值取决于用于创建哈希的 new 的样式。如果指定了一个块,它将使用哈希对象和键调用,并且应该返回默认值。

所以“_”是被设置对象的值,作者并不关心。中间行只检查 key 是否仅包含数字,如果不是,则将 key value 分配给具有此 key value 的数组。如果密钥仅包含数字,则忽略它。

Ruby 的 Regexp#===只是 Regexp#=~ 的别名

请注意——这是一段可怕的、难以阅读的代码。仅仅因为你可以写这样的东西并不意味着你应该这样做。请不要受到启发。

于 2012-12-03T16:41:53.597 回答
0

这是Hash::new Ruby 文档的摘录:

如果指定了 obj,则此单个对象将用于所有默认值。如果指定了一个块,它将使用哈希对象和键调用,并且应该返回默认值。如果需要,将值存储在散列中是块的责任。

在您的情况下,它是一个块,它定义了一个在找不到键时将返回的默认值。在这种情况下,仅当键与给定的正则表达式匹配时才会返回它/^\d+$/[key]这意味着它将在数组中返回。

于 2012-12-03T16:42:29.237 回答