Ruby 雜湊(Hash)

Ruby 雜湊(Hash)

雜湊(Hash)是類似 "key" => "value" 這樣的鍵值對集合。雜湊類似於一個數組,只不過它的索引不侷限於使用數字。

Hash 的索引(或者叫"鍵")幾乎可以是任何物件。

Hash 雖然和陣列類似,但卻有一個很重要的區別:Hash 的元素沒有特定的順序。 如果順序很重要的話就要使用陣列了。

建立雜湊

與陣列一樣,有各種不同的方式來建立雜湊。您可以通過 new 類方法建立一個空的雜湊:

months = Hash.new

您也可以使用 new 建立帶有預設值的雜湊,不帶預設值的雜湊是 nil

months = Hash.new( "month" )months = Hash.new "month"

當您訪問帶有預設值的雜湊中的任意鍵時,如果鍵或值不存在,訪問雜湊將返回預設值:

例項

#!/usr/bin/ruby months = Hash.new( "month" ) puts "#{months[0]}" puts "#{months[72]}"

嘗試一下 ?

以上例項執行輸出結果為:

month
month

例項

#!/usr/bin/ruby H = Hash["a" => 100, "b" => 200] puts "#{H['a']}" puts "#{H['b']}"

嘗試一下 ?

以上例項執行輸出結果為:

100
200

您可以使用任何的 Ruby 物件作為鍵或值,甚至可以使用陣列,如下例項所示:

[1,"jan"] => "January"

雜湊內建方法

如果需要呼叫 Hash 方法,需要先例項化一個 Hash 物件。下面是建立 Hash 物件例項的方式:

Hash[[key =>|, value]* ] or Hash.new [or] Hash.new(obj) [or] Hash.new { |hash, key| block }

這將返回一個使用給定物件進行填充的新的雜湊。現在,使用建立的物件,我們可以呼叫任意可用的方法。例如:

例項

#!/usr/bin/ruby $, = ", " months = Hash.new( "month" ) months = {"1" => "January", "2" => "February"} keys = months.keys puts "#{keys}"

嘗試一下 ?

以上例項執行輸出結果為:

["1", "2"]

下面是公共的雜湊方法(假設 hash 是一個 Hash 物件):

序號方法 & 描述
1hash == other_hash
檢查兩個雜湊是否具有相同的鍵值對個數,鍵值對是否相互匹配,來判斷兩個雜湊是否相等。
2hash[key]
使用鍵,從雜湊引用值。如果未找到鍵,則返回預設值。
3hash[key]=value
value 給定的值與 key 給定的鍵進行關聯。
4hash.clear
從雜湊中移除所有的鍵值對。
5hash.default(key = nil)
返回 hash 的預設值,如果未通過 default= 進行設定,則返回 nil。(如果鍵在 hash 中不存在,則 [] 返回一個預設值。)
6hash.default = obj
hash 設定預設值。
7hash.default_proc
如果 hash 通過塊來建立,則返回塊。
8hash.delete(key) [or]
array.delete(key) { |key| block }

通過 keyhash 中刪除鍵值對。如果使用了塊 且未找到匹配的鍵值對,則返回塊的結果。把它與 delete_if 進行比較。
9hash.delete_if { |key,value| block }
block 為 true 的每個塊,從 hash 中刪除鍵值對。
10hash.each { |key,value| block }
遍歷 hash,為每個 key 呼叫一次 block,傳遞 key-value 作為一個二元素陣列。
11hash.each_key { |key| block }
遍歷 hash,為每個 key 呼叫一次 block,傳遞 key 作為引數。
12hash.each_key { |key_value_array| block }
遍歷 hash,為每個 key 呼叫一次 block,傳遞 keyvalue 作為引數。
13hash.each_value { |value| block }
遍歷 hash,為每個 key 呼叫一次 block,傳遞 value 作為引數。
14hash.empty?
檢查 hash 是否為空(不包含鍵值對),返回 truefalse
15hash.fetch(key [, default] ) [or]
hash.fetch(key) { | key | block }

通過給定的 keyhash 返回值。如果未找到 key,且未提供其他引數,則丟擲 IndexError 異常;如果給出了 default,則返回 default;如果指定了可選的 block,則返回 block 的結果。
16hash.has_key?(key) [or] hash.include?(key) [or]
hash.key?(key) [or] hash.member?(key)

檢查給定的 key 是否存在於雜湊中,返回 truefalse
17hash.has_value?(value)
檢查雜湊是否包含給定的 value
18hash.index(value)
為給定的 value 返回雜湊中的 key,如果未找到匹配值則返回 nil
19hash.indexes(keys)
返回一個新的陣列,由給定的鍵的值組成。找不到的鍵將插入預設值。該方法已被廢棄,請使用 select。
20hash.indices(keys)
返回一個新的陣列,由給定的鍵的值組成。找不到的鍵將插入預設值。該方法已被廢棄,請使用 select。
21hash.inspect
返回雜湊的列印字串版本。
22hash.invert
建立一個新的 hash,倒置 hash 中的 keysvalues。也就是說,在新的雜湊中,hash 中的鍵將變成值,值將變成鍵。
23hash.keys
建立一個新的陣列,帶有 hash 中的鍵。
24hash.length
以整數形式返回 hash 的大小或長度。
25hash.merge(other_hash) [or]
hash.merge(other_hash) { |key, oldval, newval| block }

返回一個新的雜湊,包含 hashother_hash 的內容,重寫 hash 中與 other_hash 帶有重複鍵的鍵值對。
26hash.merge!(other_hash) [or]
hash.merge!(other_hash) { |key, oldval, newval| block }

與 merge 相同,但實際上 hash 發生了變化。
27hash.rehash
基於每個 key 的當前值重新建立 hash。如果插入後值發生了改變,該方法會重新索引 hash
28hash.reject { |key, value| block }
類似 delete_if, 但作用在一個拷貝的雜湊上。相等於 hsh.dup.delete_if。
29hash.reject! { |key, value| block }
相等於 delete_if, 但是如果沒有修改,返回 nil。
30hash.replace(other_hash)
hash 的內容替換為 other_hash 的內容。
31hash.select { |key, value| block }
返回一個新的陣列,由 block 返回 truehash 中的鍵值對組成。
32hash.shift
hash 中移除一個鍵值對,並把該鍵值對作為二元素陣列返回。
33hash.size
以整數形式返回 hashsize 或 length。
34hash.sort
hash 轉換為一個包含鍵值對陣列的二維陣列,然後進行排序。
35hash.store(key, value)
儲存 hash 中的一個鍵值對。
36hash.to_a
從 hash 中建立一個二維陣列。每個鍵值對轉換為一個數組,所有這些陣列都儲存在一個數組中。
37hash.to_hash
返回 hash(self)。
38hash.to_s
hash 轉換為一個數組,然後把該陣列轉換為一個字串。
39hash.update(other_hash) [or]
hash.update(other_hash) {|key, oldval, newval| block}

返回一個新的雜湊,包含 hashother_hash 的內容,重寫 hash 中與 other_hash 帶有重複鍵的鍵值對。
40hash.value?(value)
檢查 hash 是否包含給定的 value
41hash.values
返回一個新的陣列,包含 hash 的所有值。
42hash.values_at(obj, ...)
返回一個新的陣列,包含 hash 中與給定的鍵相關的值。