1. 程式人生 > Ruby 程式語言入門 >12 Ruby 的雜湊

12 Ruby 的雜湊

本章節我們學習另外一個可以組合多個的物件類——雜湊,瞭解雜湊是什麼,如何建立一個雜湊以及雜湊物件的例項方法。

1. 什麼是雜湊

雜湊是鍵值對的集合。—— 官方定義

雜湊是另一種非常有用且廣泛使用的東西,可用於儲存其他物件。與僅作為列表的陣列不同,雜湊表就像字典。我們通過鍵(key)來查詢雜湊中的值(value)。好比我們有一個英漢詞典,我們通過查詢“hello的單詞來找到中文意思"你好",此時,“hello“就是作為鍵,而“你好”就是值。

我們將雜湊的每一對鍵和值稱為鍵值對,每一個雜湊可以擁有任意數量的鍵值對。

2. 如何建立一個雜湊

與陣列一樣,雜湊有很多建立方法,我們可以通過雜湊所屬 Hash 類

中的new方法來建立一個空的雜湊。

例項:

> Hash.new
=> {}

我們也可以在建立雜湊的時候為它賦予初始值:

例項:

> H = Hash["a" => 100, "b" => 200]
=> {"a"=>100, "b"=>200}

在 Ruby 中,我們通過使用=>將鍵分配給值來建立雜湊,用逗號分隔多個鍵值對,並用花括號將整個內容括起來。

例項:

> a = { "one" => "1", "two" => "2", "three" => "3" }
=> {"one"=>"1", "two"=>
"2", "three"=>"3"}

解釋:這是一個定義了3個鍵值對的雜湊,我們可以通過 one,來找到 1,通過 two 來找到 2,也可以通過three 來找到 3。

我們更多使用標誌物件(Symbol)或者字串物件(String)來作為雜湊的鍵。不過我們記住一點:雜湊的鍵和值可以是任意型別的物件

例項:

{ 1 => "eins", 2 => "zwei", 3 => "drei" }
{ :one => "eins", :two => "zwei", :three => "drei" }
{ "weights" => ["pound"
, "kilogram"], "lengths" => ["meter", "mile"] } { :de => { :one => "eins", :two => "zwei", :three => "drei" } }

解釋:

  • 第一個例項使用數字型別作為鍵,第二個則使用標誌型別作為鍵;

  • 第三個例項我們看到它的值是一個數組;

  • 第四個示例我們得到一個巢狀的雜湊,在雜湊中我們還可以將鍵對應的值設定成另一個雜湊。

Tips : 關於格式化:請注意,兩側的花括號內,=>周圍以及每個逗號後都有一個空格。

經驗:

標誌物件(Symbol)作為鍵時,我們會經常使用一個新的寫法,而不是使用火箭(=>),這種寫法更貼近與 JSON 的寫法。

例項:

{ one: "eins", two: "zwei", three: "drei" }

# 與這種方法建立雜湊是等價的
{ :one => "eins", :two => "zwei", :three => "drei" }

這種寫法會讓 Ruby 將鍵解釋為 Symbol。

3. 雜湊的例項方法

3.1 查詢值

我們使用[]方法,通過傳入鍵來查詢對應的值。

例項:

# 定義一個雜湊
dictionary = { "one" => "eins", "two" => "zwei", "three" => "drei" }
puts dictionary["one"]

# ---- 輸出結果 ----
"eins"

當我們查詢的鍵沒有對應內容時,會返回一個nil

例項:

puts dictionary["four"]

# ---- 輸出結果 ----
nil

另外我們很少會用到一個fetch方法,他和[]方法一樣都可以查詢某一個鍵的值,但是如果鍵對應的值不存在,會丟擲異常。

例項:

puts dictionary.fetch("one")

# ---- 輸出結果 ----
"eins
puts dictionary.fetch("four")

# ---- 輸出結果 ----
KeyError (key not found: "four")

3.2 更改某一個鍵對應的值

使用[]=方法,傳入鍵與更改的值:

例項:

# 定義一個雜湊
dictionary = { "one" => "eins", "two" => "zwei", "three" => "drei" }
# 更改one對應的值
dictionary["one"] = "uno"
puts dictionary

# ---- 輸出結果 ----
{"one"=>"uno", "two"=>"zwei", "three"=>"drei"}

您還可以通過這種方法為雜湊增加鍵值對:

例項:

dictionary["zero"] = "null"
puts dictionary

# ---- 輸出結果 ----
{"one"=>"null", "two"=>"zwei", "three"=>"drei", "zero"=>"null"}

3.3 合併兩個雜湊

使用merge方法。

例項:

a = { "one" => "eins" }
b = { "two" => "zwei" }
puts a.merge(b)
puts a 

# ---- 輸出結果 ----
{"one"=>"eins", "two"=>"zwei"}
{"one" => "eins"}

Tips : merge!方法會在合併的同時,將結果賦值給原有的雜湊,而merge方法不會改變原有的雜湊。

例項:

a = { "one" => "eins" }
b = { "two" => "zwei" }
puts a.merge(b)
puts a

# ---- 輸出結果 ----
{"one"=>"eins", "two"=>"zwei"}
{"one"=>"eins", "two"=>"zwei"}

3.4 獲得雜湊擁有的所有鍵

keys返回一個帶有雜湊知道的所有鍵的陣列:

例項:

# 定義一個雜湊
dictionary = { "one" => "eins", "two" => "zwei", "three" => "drei" }
dictionary.keys

# ---- 輸出結果 ----
["one", "two", "three"]

3.5 獲得雜湊擁有的所有值

values返回一個帶有雜湊所有值的陣列:

# 定義一個雜湊
dictionary = { "one" => "eins", "two" => "zwei", "three" => "drei" }
dictionary.values

# ---- 輸出結果 ----
["eins", "zwei", "drei"]

3.6 判斷是不是空雜湊

使用empty?

例項:

{}.empty?

# ---- 輸出結果 ----
true

或者使用size或者length方法,判斷雜湊的大小是否為0。

例項:

dictionary = { "one" => "eins", "two" => "zwei", "three" => "drei" }
puts dictionary.size == 0
puts dictionary.length == 0

# ---- 輸出結果 ----
false
false

3.7 刪除一個鍵值對

通過delete,並傳入要刪除的鍵作為引數。

dictionary = { "one" => "eins", "two" => "zwei", "three" => "drei" }
dictionary.delete("one")
puts dictionary

# ---- 輸出結果 ----
{"two"=>"zwei", "three"=>"drei"}

如果鍵不存在,則不會進行操作。

4. 小結

本章中我們學習瞭如何建立一個雜湊,通過雜湊如何查詢值、替換值、增加值,合併雜湊、刪除鍵值對、獲得雜湊鍵或值的陣列、判斷是否為空。