程式扎記: [ Ruby Gossip ] Basic : 內建型態與操作 - 雜湊型態

標籤

2014年10月11日 星期六

[ Ruby Gossip ] Basic : 內建型態與操作 - 雜湊型態

Source From Here 
Preface 
在 Ruby 中,雜湊物件是儲存鍵(Key)/值(Value)對應的物件,為 Hash 的實例。直接示範如何以實字建立雜湊物件: 
 

雜湊型態 
建立雜湊時,每個鍵物件(在上例中是字串,也可以是任何物件)會用來取得對應的值物件,指定鍵物件取得值物件時是使用 [] 操作。建立雜湊物件後,可以隨時再加入鍵/值。如果要刪除某個鍵/值,則可以使用 delete 方法,如果指定的鍵存在,delete 會傳回對應的值,若鍵不存在,預設會傳回 nil,delete 也可以指定區塊,若鍵不存在,區塊傳回值就是 delete 的傳回值. 

直接使用實字建立雜湊,若指定鍵要取得值時,雜湊中沒有該鍵的存在,則會傳回 nil,若使用 fetch 方法指定鍵取值,在鍵不存在時會引發 KeyError 例外,如果有指定 fetch 的第二個引數,則鍵不存在時會傳回指定的第二個引數。可以使用 key?hash_key?member?include? 等方法來測試鍵是否存在於字典中,可以使用 value? 或 has_value? 方法測試指定的值是否存在。例如: 
 

在上例中可以看到,fetch方法可以指定區塊,在指定的鍵不存在時,區塊的傳回值會是fetch的傳回值。可以使用Hash.new來建立雜湊物件,如果呼叫時有傳入引數,則指定的鍵不存在時,會傳回Hash.new時傳入的引數,如果呼叫Hash.new時沒有傳入引數,指定的鍵不存在時會傳回nil。例如: 
 

可以看到,Hash.new 時也可以指定區塊,區塊的傳回值就會是在指定的鍵不存在時的傳回值。想要知道雜湊長度,可以使用 size 或 length 方法,想要知道雜湊是否為空,可以使用empty? 方法,想要取得雜湊中所有鍵,可以使用 keys 方法,這會以陣列傳回所有鍵,想要取得雜湊中所有值,可以使用 values 方法,這會以陣列傳回雜湊中所有值,使用 to_a,則將鍵值以二維陣列傳回: 
>> passwords = {"Justin" => 123456, "caterpillar" => 933933}
=> {"Justin"=>123456, "caterpillar"=>933933}
>> passwords.length
=> 2
>> passwords.keys
=> ["Justin", "caterpillar"]
>> passwords.values
=> [123456, 933933]
>> passwords.to_a
=> [["Justin", 123456], ["caterpillar", 933933]]

想要逐一取得雜湊中的鍵,可以使用 each_key 方法,想要逐一取得雜湊中的值,可以使用each_value 方法,想要逐一取得鍵與值,可以使用 each 方法: 
 

之後會談到,建立雜湊時,任何實例 可以作為鍵,但建議重新定義 eq? 與 hash 方法,而且最好使用不可變動物件作為鍵,先前談 符號型態 時說明過,Symbol 實例為不可變動,且擁有唯一性,因此經常用來作為雜湊的鍵物件。例如: 
>> passwords = {:Justin => 123456, :caterpillar => 933933}
=> {:Justin=>123456, :caterpillar=>933933}
>> passwords[:Justin]
=> 123456
>> passwords[:caterpillar]
=> 933933

因為 Symbol 實例作為鍵很常用,在 Ruby1.9 之後,還可以寫得更簡潔,作用與上例相同: 
>> passwords = {Justin: 123456, caterpillar: 933933}
=> {:Justin=>123456, :caterpillar=>933933}
>> passwords[:Justin]
=> 123456
>> passwords[:caterpillar]
=> 933933

在 Ruby 1.9 之後,雜湊是有序的,鍵的順序就是安插雜湊的順序,也會使用索引記錄。例如: 
 

each_with_index 方法的第一個區塊參數接受陣列物件,當中包括每次迭代的鍵與值物件,第二個區塊參數則是索引。上例中第二次使用 each_with_index 時,使用括號 (key, value),這會將陣列中第一個索引元素指定給 key,第二個索引元素指定給 value,利用的是 陣列型態 中談過的特性! 

Supplement 
tutorialpoints - Ruby Hashes 
A Hash is a collection of key-value pairs like this: "employee" => "salary". It is similar to an Array, except that indexing is done via arbitrary keys of any object type, not an integer index...

rubylearning.com - Ruby Hashes

沒有留言:

張貼留言

網誌存檔

關於我自己

我的相片
Where there is a will, there is a way!