2012-12-03 70 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]的密鑰匹配意味着它將在數組內返回的情況下,它纔會返回它。