iT邦幫忙

2022 iThome 鐵人賽

DAY 3
0
Modern Web

一探紅寶石的神秘面紗 - Ruby 及 Rails入門介紹 系列系列 第 3

Day 3 - 到Ruby世界不可不認識:陣列

  • 分享至 

  • xImage
  •  

陣列 Array

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

建立陣列

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

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 的方式知道其中內部含有幾個元素。

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

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

select

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

以上就是初步對於Ruby中的陣列使用及方法介紹,下一章節讓我們來了解Ruby特殊的"範圍"方法可以應用在陣列或是其他資料型態中,這會是個神奇黑魔法喔,大家敬請期待!!


參考資料:

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

上一篇
Day 2 - 到Ruby世界不可不認識:變數、數字、字串
下一篇
Day 4 - 到Ruby世界不可不認識:範圍
系列文
一探紅寶石的神秘面紗 - Ruby 及 Rails入門介紹 系列30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言