我不喜歡爲範圍內的每個可能條目創建單獨的鍵/值對。它根本無法擴展,特別是對於廣泛的範圍。考慮這個小範圍:
'a' .. 'zz'
這將導致702個額外的鍵。嘗試('a'..'zz').to_a
的樂趣。前進。我會等。
而不是創建密鑰,攔截查找。重用RangedHash
類名稱:
class RangedHash < Hash
def [](key)
return self.fetch(key) if self.key? key
self.keys.select{ |k| k.is_a? Range }.each do |r_k|
return self.fetch(r_k) if r_k === key
end
nil
end
end
foo = RangedHash.new
foo[1] = [6,2,2]
foo[2] = [7,4,5]
foo[3..7] = [7,2,1]
此時foo
樣子:用於測試的方法
{1=>[6, 2, 2], 2=>[7, 4, 5], 3..7=>[7, 2, 1]}
:
require 'pp'
3.upto(7) do |i|
pp foo[i]
end
,輸出:
[7, 2, 1]
[7, 2, 1]
[7, 2, 1]
[7, 2, 1]
[7, 2, 1]
對於任何價值i在一個範圍內,輸出與該範圍相關的值。超出範圍但仍在散列中定義的值正常工作,對散列中不存在的鍵返回nil
也是如此。而且,它保持儘可能小的散列。
這個問題或任何問題的解決方案的缺點是範圍可能重疊導致衝突的關鍵。在大多數提議的解決方案中,鍵會彼此跺腳,這可能最終會返回錯誤的值。這種方法不會這樣做,因爲它會直接衝突來覆蓋範圍鍵。
要解決這個問題,需要確定是否允許重疊,如果是,是否可以返回找到的第一個,或者是否存在確定「最佳擬合」的邏輯,即最小範圍完全適合或者其他一些標準。或者,如果價值相同,應該重疊加入一個更大的範圍?這是一個蠕蟲的罐頭。
你想要什麼不清楚?你想要什麼輸出?你有什麼投入? –
@iAmRubuuu我認爲這很清楚,他們正在尋找一種方法來輕鬆初始化Hashes,而無需循環,他們可以指定一系列具有相同值的鍵。 –
[如何引用哈希鍵中的值]的可能重複(http://stackoverflow.com/questions/8379814/how-to-reference-a-value-for-a-key-in-a-哈希) –