【Ruby 學習筆記 — 07】雜湊(Hash)

寫在前頭

Kimika@小鳥
小鳥的隨筆生活
4 min readJan 17, 2019

--

這個學習筆記系列作為我自己學習 Ruby 過程中筆記整理,Main purpose 是提供自己將來隨時 refer,而不是一個教程系列,加上本身有其他語言經驗因此很多概念和名詞不會多作解釋,因此不適合沒有任何程式基礎的讀者。Happy Coding !

雜湊(Hash)

雜湊是一種資料結構,像許多語言中的物件、python 中的字典。

建立雜湊

雜湊是以 key 和 value 組成,Ruby 中雜湊主要有兩種寫法
第一種箭頭式的寫法:

key 可以使用字串、symbol、甚至數字
通常我們使用 symbol 來當 key。

Ruby 1.9 之後提供了另一種寫法,和其他語言非常相近,通常我都這樣寫。

這種寫法 key 不需要引號或冒號,會直接轉成 symbol。

雜湊存取、修改

要取得雜湊中的值就如陣列,使用中括號填入 key,注意 symbol 的冒號

新增、修改可以直接 assign 值

#keys #values

傳回整個 hash 的 key 或 value 陣列

#has_key? #has_value?

檢查 hash 裡是否有指定的 key 或 value

#key

反過來以 value 查 key,如果 value 有重複的只會會傳第一個,找不到該 value 則回傳 nil

遍歷 hash

要遍歷 hash 通常使用 each,就像陣列一樣。
如果 code block 的參數只給一個,則會給一個 key 跟 value 的陣列。
可以定義兩個參數把 key 和 value 分開

hash 複製

物件的複製在程式語言中是一定要注意的問題
先來個例子:

在這個例子中我們把 hash_1 assign 給 hash_2,修改 hash_2 的內容,但是發現 hash_1 也被修改了。

這是因為在 hash_2 = hash_1 這個動作中,我們並沒有把 hash_1 的內容都複製給 hash_2 , 而是把 hash_2 這個變數指向 hash_1,這兩個實際上還是同一個 object。
我們講到 Ruby 一切都是 object,實際上不只 hash,複製這件事情在字串、陣列等等都會有問題,也是新手的一道坎。
這要講到 call by value 、 call by reference 以及 shallow copy、deep copy等等的概念。

ruby 中提供 #clone #dup 兩個複製物件的方法,也稍有差異,並且他們都是 shallow copy,在rails 環境中有提供一個 #deep_dup 做 deep copy。

在純 ruby 中的 deep copy 可以使用 Marshel 做 load ,但它也不是完美的解法而且只限能用轉成 Marshel 的物件。

事實上作 deep copy 效能也是需要考量的一點,複製的方法都是 case by case的。

這次的 Reference 會附上幾個可以參考的文章。

--

--