鐵 人
Ruby女孩(9):老媽,你不能決定,讓我用紅寶石的陣列幫你決定吧!
2014.Oct.09

今天要來提提Ruby 的 陣列(Array),首先我們先來閱讀一小段書中文字(p.67):

『陣列是一個由值所構成的序列,允許你透過位置或索引值以循序的方式存取其中的值。Ruby 中,陣列的第一個值會被擺在索引值為0 的位置上。』

我們先來看看陣列的簡單範例:

這是陣列:[6, 8, 9]
這也是陣列:["你", "看", "看", "你"]
就算混搭也還是陣列:["你", 6, "看", 8, "看", 9, "你"]
不可質疑你的陣列:[[6, 8, 9], ["你", "看", "看", "你"], ["忘", "了"]]
還可以這樣的陣列:[ -99..-1, 0, 1..99 ]
你想怎樣就怎樣的陣列(?)[ x*y, x+y, x-y ] #要先宣告x 和y 是什麼才可以用噢!
你不想放任何東西也是陣列:[]

希望初學者不要昏頭了,上面這些都是陣列,其實陣列是我在學Ruby 時覺得最好理解的部分了!以下整理Ruby 中陣列的兩大特點:

  • 特點一:型別未定(untyped)
    • 陣列中的元素並不需要全部屬於相同的類別,所以上面的例子你可以看到,可以放數字、字串、範圍、運算式,也可以數字、字串混搭,甚至在陣列中再加入陣列也可以!
  • 特點二:可改變(mutable)
    • 可以動態調整陣列的大小,意指可以添加元素。

如果你懶得像上面那樣慢慢打出陣列的內容,你也可以使用 %w%W [註1],用法如下:

%w(你 看 看 你) # => ['你','看','看','你']  
%W(你看看 你) # => ["你看看", "你"]  

[註1] %w 是把字串實字以單引號表示; %W 是把字串實字以雙引號表示,有點類似於之前在字串的文章中所提的 %q%Q

接著我們來看看陣列的取值(與字串取值很雷同):

a = ["你", 6, "看", 8, "哈", 9, "嘎"]  
  
a[0]   # => "你" 第一個字的索引值為0!切記!  
a[-1]  # => "嘎" 倒數第一個字  
a[3]   # => 8  

#選出"看"、"8"、"哈"的方式:
a[2,3]   # => ["看", 8, "哈"] 索引值為2開始,往右找三個值出來  
a[2..4]  # => ["看", 8, "哈"] 索引值為2開始,找到索引值為4停止  
  
#超過陣列範圍就沒有東西  
a[99]  # => nil  

看起來跟字串的取值很像吧!來講個我學了Array 以後,在生活上用到的例子:

生活例子:讓開,讓專業的來!

我媽前陣子一直在猶豫要不要退休,看起來就跟撕花瓣想對方愛不愛我一樣苦惱,為了維護大自然,我們不撕花瓣,我們寫Ruby:

#寫一個放兩個字串值的陣列,並把字串取名叫做i_suggest [註2]  
i_suggest = ["我要退休!我要出去玩!", "算了再工作一陣子好惹!"]  
  
#然後用Array的方法.sample來隨機取得一個Array中的值  
i_suggest.sample  
  
i_suggest.sample #=> "算了再工作一陣子好惹!"  
i_suggest.sample #=> "我要退休!我要出去玩!"  

#老媽你不能決定,那我就讓紅寶石幫你決定吧XD!  

[註2]別忘了變數命名方式,可參考我的第四天文章中的識別字部分

看了上面的例子,其實也可以想到,既然Array有.sample的方法,應該可以寫一個樂透程式吧!我們也來偷渡一個這部分書上還沒寫出的方法:.to_a (昨天我們講過.to_i.to_s)

.to_a可以把東西變成Array,所以我們可以把範圍變成Array 後,再讓它隨機跑出6個值:

#大樂透的號碼範圍  
(1..49)  
  
#把範圍變成Array  
(1..49).to_a  
  
#從這個Array中隨機找出六個值  
(1..49).to_a.sample(6)  
  
#跑個三次看看結果: 
(1..49).to_a.sample(6) #=> [11, 43, 18, 36, 16, 2]  
(1..49).to_a.sample(6) #=> [30, 12, 17, 9, 29, 24]  
(1..49).to_a.sample(6) #=> [12, 10, 11, 18, 19, 40]  

如果Ruby 幫你中樂透,別忘了我XD,我是說,跟我分享這個好消息啦XD

OK,明天再來分享Array 的運算,Array 的部分就能先告一段落!


第九天,我想到這句話:

If you fear failure, you will never go anywhere.

其實在學的過程中,也是常常撞牆,也有一直讀不通,也有很想跳過的部分,但還是希望自己可以突破,不然我哪兒也去不了!

Ruby女孩(10):["十年","好姐妹","陣列萬歲"]
2014.Oct.10
Ruby女孩(8):字串迭代小練習!
2014.Oct.08
comments powered by Disqus