2012-12-03 44 views

回答

3

此代码设置的默认值,当一个不存在的密钥被访问时返回。

在这种特定情况下,如果给定的key是整数的表示形式,则默认设置为在Array内返回给定key

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" 

关于块参数命名: 你能说出第一个参数是任何你喜欢的,但是一些开发者喜欢命名一个未使用的块运算符_。乍一看,这种方式很明显,你不关心这个参数。

2

[key] if /^\d+$/ === keydefault_proc。它每次在散列中找到一个密钥而不是时运行。如果“123”不是现有密钥,则ALIASES["123"]将返回["123"]

0

请看看哈希::新文档here。它说:

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

因此,“_”是对象的值被设置,笔者并不关心它。中间线只检查密钥是否仅包含数字,如果不包含,则使用此密钥值将密钥值分配给数组。如果密钥仅包含数字,则不予考虑。

Ruby的正则表达式#===是just an alias正规表达式#=〜。

只是注意 - 这是一个可怕的,不可读的一段代码。只是因为你可以写这样的东西并不意味着你应该。请别激发灵感。

0

下面是摘录自Ruby documentation for Hash::new

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

在你的情况下,它是一个块,它定义了一个默认值,当没有找到一个键的时候它会被返回。在这种情况下,只有在给定正则表达式/^\d+$/[key]的密钥匹配意味着它将在数组内返回的情况下,它才会返回它。