Chiayin's blog

【2020 12th鐵人賽】Ruby名詞解釋總匯 - Day 6 : Ruby中的「陣列、範圍」

字數統計: 1.2k閱讀時間: 5 min
2022/10/30

https://ithelp.ithome.com.tw/upload/images/20200913/20129424nDeeWcyg0a.jpg

陣列 Array

*英文發音
首先來聽聽英文發音~。
Yes

何謂陣列?

陣列[]:是一組相同型態的連續變數,它們使用同一個變數名稱,而另外用一個索引值來指定使用第幾個變數。在方括號[]裡放進同類型的元素,而在Ruby世界的陣列能夠容納各種型別的物件。

如何建立陣列?

  1. new 一個陣列的類別

    1
    x = Array.new
  2. 直接指向方括號,為常用的寫法,並使用逗號區別元素。

    1
    2
    3
    y = []

    Array = [1,2,3,4,5,"aa"]
  3. 使用%w,會建立字串的陣列

    1
    2
    3
    4
    Array = %w(aa bb nn)

    p Array
    -> # 印出 ["aa", "bb", "nn"]

索引號碼 (index number)

使用索引號碼可以指向陣列的任何部分,位置從0開始計算,使用方法如下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
food = ['豆腐', '素漢堡', '素pizza', '素手捲', '素糕', '薯條']

puts food[0] -> # 印出 豆腐
puts food[1] -> # 印出 素漢堡
puts food[-1] -> # 印出 薯條
puts food[-2] -> # 印出 素糕

# 或是使用ruby的內建方法
puts food.first -> # 印出 豆腐
puts food.last -> # 印出 薯條

# 計算陣列內元素個數
puts food.length -> # 印出 6
food << '堅果奶茶' -> #在陣列的最後面加一個人
puts food.length -> # 印出 7
food.push('燕麥奶茶') -> # 正規的方法
puts food.length -> # 印出 8

Ruby內建關於陣列的方法

有了陣列之後,我們可以利用陣列做邏輯運算,而Ruby內建也建立許多快速好用的方法,方便使用者。而要獲得這些方法,則是需要好好閱讀文件,熟悉用法,以協助更熟練使用Ruby語言唷!(Ruby Array 手冊

以下介紹會介紹幾個常用的方法。

map方法

*定義
對Array裡的每個元素「進行計算」,並收集成一個新的Array。
同義詞:collect

1
2
3
4
5
6
7
8
9
10
Array = [1,2,3,4,5]

# {}裡寫下條件,以下範例為:讓陣列裡每個元素都乘以兩倍。
p Array.map {|x| x * 2 }

# 使用同義詞collect也可以達到同樣的效果。
p Array.collect {|x| x * 2 }

# 以下範例的運算為變成「平方」。
p Array.map {|x| x * x }

select方法

*定義
從集合裡「篩選符合條件」的元素,並收集成一個新的集合。
同義詞:filter
反義詞:reject

以下使用到的(1..10)為範圍,展開後為[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

1
2
3
4
5
6
7
# 將條件寫在{}裡,以下範例為:篩選小於5的數字。
p (1..10).select { |x| x < 5 }
-> # 印出來 [1,2,3,4]

# 使用反義詞,則會篩遠出相反的數字。
p (1..10).reject { |x| x < 5 }
-> # 印出來 [5, 6, 7, 8, 9, 10]

reduce方法

定義
對集合裡的每個元素「進行運算」,並將所有的運算結果歸納成一個「單一結果」。
同義詞:inject

1
2
3
# sum為總和的意思,以下案例為:1+2+3...+10的數學運算
p(1..10).reduce { |sum, x| sum + x }
-> # 印出來 55

若沒有這個方法的話則需要自己寫一個迴圈,寫Ruby是不是方便很多呢!


範圍 Range

*英文發音
首先來聽聽英文發音~。
Yes

何謂範圍?

為Ruby的特點,很多程式語言沒有這樣的設計。使用().來縮寫想要表達一串的元素。直接看範例會比較清楚。

  1. 使用兩個..,較常使用。
    puts (1..10).to_a -> # 印出 1~10
1
2
3
4
5
6
(1..10)
# 展開範圍 1~10
# [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

('a'..'z') # 範圍 a~z
('A'..'Z') # 範圍 A~Z
  1. 使用三個...,建議不要使用,避免混淆。
    puts (1...10).to_a -> # 印出 1~9

  2. 也可以結合迴圈、條件式……等使用。

    1
    2
    3
    for i in 1..10
    puts i
    end

或是以下case...when

1
2
3
4
5
6
7
8
9
10
11
12
age = 10

case age
when 0..3
puts "嬰兒"
when 4..10
puts "兒童"
when 11..17
puts "青少年"
else
puts "成年"
end

回家作業

請參考Ruby Array 手冊來完成以下題目。

1
2
3
4
1. 把陣列[7, 8, 9]塞入三組同樣的數字,如[7, 8, 9, 7, 8, 9, 7, 8, 9, 7, 8, 9]。
2. 把陣列[1,3,4,1,7,nil,7]由小到大排序,並移除「nil」以及「重複」的數字。
3. 印出5個小於100且不重複的亂數

參考解答

1
2
3
4
1. [7, 8, 9] * 4 -> [7, 8, 9, 7, 8, 9, 7, 8, 9, 7, 8, 9]
2. [1,3,4,1,7,nil,7].compact.sort.unip -> [1,3,4,7]
3. p (1..52).to_a.shuffle.first(5)
或使用取樣方法 p (1..100).to_a.sample(5)

參考資料

本文於 2020-09-13 發表在舊網站。

發佈日期:2022-10-30

更新日期:2022-10-30

CATALOG
  1. 1. 陣列 Array
    1. 1.1. 何謂陣列?
    2. 1.2. 如何建立陣列?
    3. 1.3. 索引號碼 (index number)
    4. 1.4. Ruby內建關於陣列的方法
      1. 1.4.1. map方法
      2. 1.4.2. select方法
      3. 1.4.3. reduce方法
  2. 2. 範圍 Range
    1. 2.1. 何謂範圍?
  3. 3. 回家作業
    1. 3.1. 參考解答
  4. 4. 參考資料