iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 6
0
自我挑戰組

Ruby名詞解釋總匯系列 第 6

Day 6 : Ruby中的「陣列、範圍」

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

陣列 Array

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

何謂陣列?

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

如何建立陣列?

  1. new 一個陣列的類別
x = Array.new
  1. 直接指向方括號,為常用的寫法,並使用逗號區別元素。
y = []

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

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

索引號碼 (index number)

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

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

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]

# 將條件寫在{}裡,以下範例為:篩選小於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

# 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..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. 也可以結合迴圈、條件式......等使用。

for i in 1..10
  puts i 
end

或是以下case...when

age = 10

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

回家作業

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

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. [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)

參考資料


上一篇
Day 5 : Ruby中的「數字、符號」
下一篇
Day 7 : Ruby中的「Hash」
系列文
Ruby名詞解釋總匯14
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言