Ruby的數(shù)組和hash都是帶索引的集合。它們都可以容納一組對(duì)象,并允許以索引鍵來(lái)訪問(wèn)這些對(duì)象。對(duì)數(shù)組而言,索引鍵是一個(gè)整數(shù);而hash則允許用任何對(duì)象作為索引鍵。數(shù)組和hash都能夠自動(dòng)增長(zhǎng)以容納新的元素。數(shù)組和hash都可以容納不同類(lèi)型的對(duì)象。
數(shù)組:
方括號(hào)里列出元素并用逗號(hào)將它們相互隔開(kāi)來(lái)創(chuàng)建一個(gè)數(shù)組.?Ruby的數(shù)組可以適應(yīng)不同的對(duì)象類(lèi)型
ruby>?ary?=?[1,?2,?"3"]
???[1,?2,?"3"]
在Ruby中數(shù)組中的元素可以是nil(null)。nil在Ruby中是一個(gè)對(duì)象與其它對(duì)象一樣,不過(guò)它恰好代表“什么都沒(méi)有”。
就像前面提到的字符串一樣.數(shù)組也可以相乘或相加
ruby>?ary?+?["foo",?"bar"]
???[1,?2,?"3",?"foo",?"bar"]
ruby>?ary?*?2
???[1,?2,?"3",?1,?2,?"3"]
我們可用索引來(lái)訪問(wèn)數(shù)組的任意一部分.
ruby>?ary[0]
???1
ruby>?ary[0,2]
???[1,?2]
ruby>?ary[0..1]
???[1,?2]
ruby>?ary[-2]
???2
ruby>?ary[-2,2]
???[2,?"3"]
ruby>?ary[-2..-1]
???[2,?"3"]
(負(fù)數(shù)索引表示到數(shù)組末尾的偏移,而不是從開(kāi)頭算起.)
數(shù)組可以和字符串互相轉(zhuǎn)化,分別使用join和split:
ruby>?str?=?ary.join(":")
???"1:2:3"
ruby>?str.split(":")
???["1",?"2",?"3"]
數(shù)組的一個(gè)常用的方法是<<,該方法會(huì)把一個(gè)值附加到數(shù)組的尾端。
ages = []
for person in @people
??? ages << person.age
end
Ruby提供一個(gè)快捷創(chuàng)建由單詞組成的數(shù)組:
a=['ant','bee','cat']
#this is the same:
a=%w{ant bee cat}
哈希表
一個(gè)關(guān)聯(lián)數(shù)組不通過(guò)連續(xù)的數(shù)字索引來(lái)訪問(wèn),而是通過(guò)任何類(lèi)型的主鍵(key)訪問(wèn).這樣的數(shù)組有時(shí)被叫作哈希(hash)或者字典
(dictionary).在Ruby里,我們趨向于用哈希這個(gè)術(shù)語(yǔ).將一對(duì)對(duì)的元素用逗號(hào)分隔開(kāi),并用大括號(hào)({})括起來(lái),這樣就組成了一個(gè)哈希表.
你用一個(gè)關(guān)鍵字在哈希表里進(jìn)行搜索,就像你在數(shù)組里用索引來(lái)提取數(shù)據(jù)一樣.
ruby>?h?=?{1?=>?2,?"2"?=>?"4"}
???{1=>2,?"2"=>"4"}
ruby>?h[1]
???2
ruby>?h["2"]
???"4"
ruby>?h[5]
???nil
ruby>?h[5]?=?10?????#?appending?value
???10
ruby>?h
???{5=>10,?1=>2,?"2"=>"4"}
ruby>?h.delete?1???#?deleting?value
???2
ruby>?h[1]
???nil
ruby>?h
???{5=>10,?"2"=>"4"}
=>左邊的是索引鍵,右邊的是與之對(duì)應(yīng)的值。在同一hash中,索引鍵必須唯一。hash中的鍵和值可以是任意對(duì)象,甚至可以在hash中保存數(shù)組或別的hash.
在訪問(wèn)hash中的元素時(shí),索引也是放在方括號(hào)中。
方法調(diào)用時(shí),可以傳入hash作為參數(shù)。如果這個(gè)hash正好是調(diào)用的最后一個(gè)參數(shù),Ruby允許省略大括號(hào)。如rails中的redirect_to()方法
redirect_to :action =>'show', :id=>product.id