在 Ruby 中,陣列是有序、以整數索引的集合,可以存放任何物件。
陣列的索引從0開始。
負索引代表從陣列尾端往回算,例如索引-1代表陣列的最後一個元素,-2代表倒數第二個元素,依此類推。
陣列通常使用[]語法來建立。
它們可以包含任何不同型別的物件。
array = [1, "two", 3.0]
可以使用#[]方法,透過索引取出陣列中的元素。
這會回傳位於該索引的元素,或回傳從起始索引開始、長度為指定數量的子陣列。
負索引會從陣列尾端往回計算。
a = [ "a", "b", "c", "d", "e" ]
a[2] #=> "c"
a[6] #=> nil
a[1, 3] #=> [ "b", "c", "d" ]
a[-1] #=> "e"
a[-2] #=> "d"
a[-3, 2] #=> ["c", "d"]
陣列有許多實用的輔助方法。 以下是幾個比較常見的:
fibonacci = [0, 1, 1, 2, 3, 5, 8, 13]
fibonacci.size #=> 8
fibonacci.sum #=> 33
fibonacci.reverse #=> [13, 8, 5, 3, 2, 1, 1, 0]
在 Ruby 中,我們不使用迴圈來走訪集合,而是使用列舉。
列舉是指逐一走訪集合(在這裡是陣列),並對每個物件執行某些動作。列舉是 Ruby 的重要概念,常用於排序、分組、映射、縮減等各種場合。
如果要列舉並印出陣列中的每個單字,程式碼會像這樣:
words = ["the", "cat", "sat"]
words.each do |word|
puts word
end
# Output:
# the
# cat
# sat
在這個例子中,我們對陣列呼叫.each方法,並傳入一個 區塊,這個區塊接受一個參數(word)並將它印出。
我們之後會在課程中更深入地探討 區塊,現在先把它們想成可以接受零個或多個引數的匿名函式。
區塊可以用do...end語法(如上)或{}語法(如下)定義。
以下還有一些使用區塊的陣列方法範例:
fibonacci = [0, 1, 1, 2, 3, 5, 8, 13]
fibonacci.count { |number| number == 1 } #=> 2
fibonacci.any? { |number| number == 6 } #=> false
fibonacci.select { |number| number.odd? } #=> [1, 1, 3, 5, 13]
fibonacci.all? { |number| number < 20 } #=> true
fibonacci.map { |number| number * 2 } #=> [0, 2, 2, 4, 6, 10, 16, 26]
你是個熱衷的賞鳥者,會記錄過去七天有多少鳥造訪你的花園。
你有 5 個任務,全都和造訪你花園的鳥的數量有關。
為了方便比較,你總是隨身保留一份上週的計數副本,分別是:0、2、5、3、7、8 和 4。實作 BirdCount.last_week 方法,回傳上週的計數:
BirdCount.last_week
# => [0, 2, 5, 3, 7, 8, 4]
實作 BirdCount#yesterday 方法,回傳昨天有多少鳥造訪你的花園。鳥的計數是按日期排序的,第一個元素是最早那天的計數,最後一個元素則是今天的計數。
birds_per_day = [2, 5, 0, 7, 4, 1]
bird_count = BirdCount.new(birds_per_day)
bird_count.yesterday
# => 4
實作 BirdCount#total 方法,回傳造訪你花園的鳥的總數:
birds_per_day = [2, 5, 0, 7, 4, 1]
bird_count = BirdCount.new(birds_per_day)
bird_count.total
# => 19
有些日子比其他日子更忙碌。忙碌的一天,是指有 5 隻以上的鳥造訪你的花園的那一天。
實作 BirdCount#busy_days 方法,回傳忙碌的天數:
birds_per_day = [2, 5, 0, 7, 4, 1]
bird_count = BirdCount.new(birds_per_day)
bird_count.busy_days
# => 2
實作 BirdCount#day_without_birds? 方法,如果有一天沒有任何鳥造訪花園,就回傳 true;否則回傳 false:
birds_per_day = [2, 5, 0, 7, 4, 1]
bird_count = BirdCount.new(birds_per_day)
bird_count.day_without_birds?
# => true