陣列 Array

陣列是每個程式語言很常碰到的資料型態,你可以想像前面講過的字串、數字通通可以塞進一個容器裡面,必且依照順序的排好,所以陣列最特別的是,有順序且是一堆資料的集合,在程式的世界裡常用這樣的方式來儲存資料,因此衍伸出許多特別的方法來處理這類型的資料,讓我們可以輕鬆拿到其中想要的內容。

建立陣列

可以透過直接指定的方式,或是藉由 ruby 特殊的%w 方式建立,但要注意這種方式所產生的內容都是字串。

1
2
list = ["apple","bird","哈樓", 1, 2]
list = %w(apple bird 哈樓 1 2) # ["apple","bird","哈樓", "1", "2"] => 用這種方式會產生的 "1","2" 是字串

拿出陣列內的元素/長度

要拿到內部的元素,我們可以透過 [索引] 的方式來取得,其中索引依照順序是從 0 開始算,
像是下面的例子可以看到 [0] 是代表取出第 1 個,而 [1] 則是第 2 個,以此類推,比較特別的是負數是表示從最後面開始算,所以 [-1] 表示最後 1 個。

我們可以透過 array.length 的方式知道其中內部含有幾個元素。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
pokemon = ["皮卡丘","傑尼龜","妙蛙種子","小火龍"]
puts pokemon[0] # 印出 皮卡丘
puts pokemon[1] # 印出 傑尼龜
puts pokemon[-1] # 印出 小火龍
puts pokemon[-2] # 印出 妙蛙種子

# 可以用first和last取出頭或尾,
puts pokemon.first # 印出 皮卡丘
puts pokemon.last # 印出 小火龍

# length表示陣列的長度
puts pokemon.length # 印出 4
pokemon << '小智' # 在最後⾯加入
puts pokemon.length # 印出 5
pokemon.push('小霞') # 最後面加入
puts pokemon.length # 印出 6
puts pokemon # 經過上面處理印出 皮卡丘, 傑尼龜, 妙蛙種子, 小火龍, 小智, 小霞

好用方法

和許多程式語言一樣,ruby 在處理陣列的資料類型中也可以透過許多方便的方法來進行處理。

map

  • 可以對陣列裡的每個元素進行操作,並收集成一個新的陣列。
  • |x|表示內部的每個元素,所以這個 x 可以自己改變名字,後面可以寫下對每個元素進行的操作或運算處理。

同意詞:collect

1
2
3
a = [1,2,3]
p a.map { |x| x*2 }
# 印出 [2, 4, 6]

select

  • 從陣列裡挑選符合條件的元素,並收集成一個新的陣列。
  • |x|表示內部的每個元素,所以這個 x 可以自己改變名字,後面可以寫下選取的條件。
    同意詞:filter
    反意詞:reject
1
2
3
a = [1,2,3,4,5,6,7,8,9,10]
p a.select { |x| x < 5 }
# 印出 [1, 2, 3, 4]

reduce

  • 對陣列內的每個元素進行運算,並將所有的運算結果歸納成一個單一結果。
  • 括號內的第一個參數表示累加值(範例使用 sum),預設沒特別指定的話就是 0,第 2 個參數表示當前的元素(範例使用 n),當前元素會依續代入陣列內數值並依照運算指示,所以下面例子中 sum 會與陣列內每個數字 n 相加,最後回傳就變成將陣列內所有數字加總的數值。
    同意詞:inject
1
2
3
a = [1,2,3,4,5,6,7,8,9,10]
p a.reduce { |sum, n| sum + n }
# 印出 55

參考資料:

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