雜湊 Hash

這是個類似陣列的容器型資料型態,裡面的資料是一組一組相互對應,我們會稱為 keyvalue,與陣列不同的是,這裡面沒有排序,不能透過[索引]方式取出內容,且用大括號包起來。

Hash 有以下的幾個特色:

  • keys 和 values 可以由任意 object 組成
  • keys 的值不可重複
  • values,是對應 keys 的物件,值可以重複

最容易想像的資料型態就像學生的成績紀錄,如同下面的表示,name 和 score 都是這個 hash 的 key,可以想像成一個而主要的標題,分別對應的內容就是’Sean’, 100 這兩個值。

1
2
3
student_score = { name: 'Sean', score: 100 }

list = {:name => "Sean", :name => "Tom"} #出錯,不能重複指定key

表示方法

  • 舊式 (符號箭頭)
1
profile = { :name => 'Sean', :age => 20 }
  • 新式 (Ruby 1.9 之後的新式寫法)
1
profile = { name: 'Sean', age: 20 }

存取資料內容

拿取資料

  • 寫過別的程式語言可能會直覺想用字串(“”)的方式拿取,但是沒辦法,記得要用:符號來拿喔!!
  • 不過 rails 環境中有特別擴充可以用字串方式去拿
1
2
3
4
5
6
7
8
9
10
11
12
profile = { name: 'Sean', age: 20 }
# 取得name的value
puts profile["name"] # nil
puts profile[:name] # Sean

# 取得age的value
puts profile["age"] # nil
puts profile[:age] # 20

#拿取全部的keys or values
profile.keys #拿取所有key => name,age
profile.values #拿取所有value => "Sean",20

存入資料

  • 用符號的方式並且指定 value 給 hash
1
2
3
character = { name: 'warrier', age: 20 }
character[:power] = 100
p character #{:name=>"warrier", :age=>20, :power=>100}

長度

可以用 length 或 size 找到內部有幾組 key 和 value

1
2
3
profile = {name: "Sean", age: 25, power:100, ability: "Ruby"}
p profile.length # 4
p h1.size # 4

參考資料:

  1. 為你自己學 Ruby on rails
  2. Ruby Docs - Hash