鐵 人
Ruby女孩(11):雜湊雜湊雜湊,重要的事情會說三次!
2014.Oct.11

啊,十天後,我們來到了書的第70頁(整本書有455頁),其實進度有點緩慢Orz 不過還是秉持著第8天的小語: 『Keep moving forward. One step at a time.』,不急,只要我繼續往前進,一次一步慢慢扎穩就好!

好的,來談談Ruby中非常重要的一環:雜湊(Hash)

什麼是雜湊?(p.70)

『雜湊(Hash)是一種資料結構,其中保存了一組稱為鍵(key)的物件,而且每個鍵都會被關聯到一個值(value)。雜湊也被稱為對映表,因為它會將鍵對應至值。雜湊有時會被稱為關聯陣列(associative array),因為每個鍵都會被關聯到一個值,所以可將它視為以任何物件(而非整數)為索引值的陣列。』

上面的文字完全來自於書本中,雖然讀起來有點跳針XD,但你不得不說,重要的事情會被說三次,你看到上面這段什麼東西出現三次了嗎XD?

『每個鍵都會被關聯到一個值』!!!

『因為它會將鍵對應至值』!!!

『因為每個鍵都會被關聯到一個值』!!!

是的!不管你要叫它什麼名字,它有一個特大重點:在雜湊中,有一個鍵(key)會對到一個值(value)! 馬上來看個例子:

rank = { "非常喜歡" => 5, "很喜歡" => 4, "沒感覺" => 3, "很討厭" => 2, "非常討厭" =>1 }  

上面這個雜湊是以大括號 { } 包起來,其中,鍵(key)指的是"非常喜歡"、"很喜歡"、"沒感覺"、"很討厭"、"非常討厭",而值(value)指的是5、4、3、2、1。

以下三種寫法都是雜湊的寫法:

rank1 = { "非常喜歡" => 5, "很喜歡" => 4, "沒感覺" => 3, "很討厭" => 2, "非常討厭" =>1 }  
rank2 = { :非常喜歡 => 5, :很喜歡 => 4, :沒感覺 => 3, :很討厭 => 2, :非常討厭 =>1 }  
rank3 = { 非常喜歡: 5, 很喜歡: 4, 沒感覺: 3, 很討厭: 2, 非常討厭: 1 }  

把上面這三行拿去irb 執行後可以看到:

rank1
=> {"非常喜歡"=>5, "很喜歡"=>4, "沒感覺"=>3, "很討厭"=>2, "非常討厭"=>1}  
  
rank2
=> {:非常喜歡=>5, :很喜歡=>4, :沒感覺=>3, :很討厭=>2, :非常討厭=>1}  
  
rank3
=> {:非常喜歡=>5, :很喜歡=>4, :沒感覺=>3, :很討厭=>2, :非常討厭=>1}  

有注意到嗎?其實rank2 與rank3 執行結果是完全相同的!rank3 的寫法是ruby1.9 之後才支援的寫法,這種寫法比較簡潔方便。但更要注意的是, "非常喜歡" 和 :非常喜歡 是完全不同的兩種key喔!以下來證明兩種完全不同(數學老師上身):

#如果我們想把rank2中的 :非常喜歡 的值從5改成100,我們可以這樣寫:
rank2[:非常喜歡] = 100
  
#此時rank2變成:  
=> {:非常喜歡=>100, :很喜歡=>4, :沒感覺=>3, :很討厭=>2, :非常討厭=>1}  
  
#但如果我的改法是這樣寫:  
rank2["非常喜歡"] = 555  
  
#此時rank2變成:  
=> {:非常喜歡=>100, :很喜歡=>4, :沒感覺=>3, :很討厭=>2, :非常討厭=>1, "非常喜歡"=>555}  

如果它找得到相同的key,會直接改掉原本key的值,但是因為他找不到相同的key,所以就在最後面新增了一組key和value。

由上述可知"非常喜歡":非常喜歡是完全不同的兩種key,得證XD!

事實上,如果你要比較兩個雜湊的鍵到底有沒有一樣,也可以使用.eql?這個方法,例如:

a = {:love =>5, :hate =>0}  => {:love=>5, :hate=>0}  
b = {"love" =>5, "hate" =>0}  => {"love"=>5, "hate"=>0}  
  
a.eql?b  => false  

再次證明這是不一樣的雜湊喔!

其實有個更重要的議題是,字串 " " 跟符號 : 的差異是什麼?好像不太能用一兩句話說清楚,這個書中在本章節最後面有提,到時候會一併說明!


第十一天,

Believe in yourself.

加油!

Ruby女孩(12):Range讓我知道..我是草莓族,Ruby不是QQ
2014.Oct.12
Ruby女孩(10):["十年","好姐妹","陣列萬歲"]
2014.Oct.10
comments powered by Disqus
Designed with by Otis Chou