2018/1/1

第十三天:認識 Ruby 的資料型態( 2018 iT邦幫忙鐵人賽-只要有心,人人都可以作卡米狗 )

markdown 今天要來學寫程式囉,今天就只講資料型態的部分,想要一天學完全部,我怕你的腦子會爆炸,畢竟在學校的話,這是一學期的課程。我們慢慢來就好,30 天之內一定會讓你學會寫聊天機器人的。 # 認識 irb 平常我們寫程式是寫在文字檔,然後再拿程式碼檔去一行行的執行程式。但當我們想要測試某一行程式碼的結果時,我們會使用 irb(Interactive Ruby) 來做測試。irb 很方便,我們可以在 irb 的環境裡面輸入一行程式碼,就能馬上得到這行程式碼的結果。 ### 進入 irb 先按 `Windows`+`R` 輸入 `cmd` 叫出小黑框: ``` D:\只要有心,人人都可以作卡米狗> ``` 輸入 `irb`。 ``` D:\只要有心,人人都可以作卡米狗>irb irb(main):001:0> ``` 輸入完之後就會進入 irb 的世界,在左側看到 irb 開頭就代表現在在 irb 裡面。 ### 離開 irb 要離開 irb 的話就輸入 `exit` 或者按 `Ctrl`+`C`。 ``` D:\只要有心,人人都可以作卡米狗>irb irb(main):001:0> exit D:\只要有心,人人都可以作卡米狗> ``` 就像這樣,就離開了 irb 的環境。 # 認識資料型態 再次進到 irb ,我們先認識一下資料型態: ### 數字 數字就是我們一般理解的數字,數學那種。 輸入 5566: ``` D:\只要有心,人人都可以作卡米狗>irb irb(main):001:0> 5566 => 5566 ``` 輸入 `5566` 之後看到 `=> 5566` 代表 `5566` 這行程式碼的執行結果是 `5566`。 接下來輸入 5566+9527 看看: ``` irb(main):002:0> 5566 + 9527 => 15093 ``` 輸入 `5566+9527` 之後看到 `=> 15093` 代表 `5566+9527` 這行程式碼的執行結果是 `15093`。 輸入 `5566.class` 可以讓 ruby 告訴我們,5566 是什麼型態: ``` irb(main):003:0> 5566.class => Integer ``` 5566 是 Integer(整數)。 ### 字串 輸入 `'5566'.class` 看看: ``` irb(main):004:0> '5566'.class => String ``` 用單引號或雙引號包起來的東西是字串,字串就是文字的意思。 輸入 `'5566+9527'` 看看: ``` irb(main):005:0> '5566+9527' => "5566+9527" ``` 因為加號也是文字的一部分,所以就不會做計算。 讓我們試著把兩個字串加起來看看,輸入`'5566'+'9527'`: ``` irb(main):006:0> '5566'+'9527' => "55669527" ``` 就像是在 5566 後面輸入 9527 一樣。 在 windows 的 irb 可能會遇到不能輸入中文的情形,目前請先別介意,我們用英文就好。 ### 變數 我們可以使用等號來幫數字或文字取名字。 ``` irb(main):007:0> idol = 5566 => 5566 ``` 變數定義完之後,我們只要叫到他,就視同輸入等號右邊的結果。 ``` irb(main):008:0> idol => 5566 ``` 事實上我們可以取名字的東西非常多,不是只有數字和文字能被取名。 ### 陣列 我們可以一次宣告大量變數,語法是中括號 [] 的中間用逗號區隔。 ``` irb(main):009:0> eat = ["Mcdonald's", 'KFC', 'BUG King', 'MOS BUG'] => ["Mcdonald's", "KFC", "BUG King", "MOS BUG"] ``` 我們這樣就宣告了4個字串變數,分別是: - eat[0] = "Mcdonald's" - eat[1] = "KFC" - eat[2] = "BUG King" - eat[3] = "MOS BUG" 在電腦的世界裡第一個數字是 0。,所以宣告一堆變數之後,第一個變數的索引是 0。 你也可以這樣寫,效果是相同的: ``` irb(main):010:0> eat = [] => [] irb(main):011:0> eat[0] = "Mcdonald's" => "Mcdonald's" irb(main):012:0> eat[1] = 'KFC' => "KFC" irb(main):013:0> eat[2] = 'BUG King' => "BUG King" irb(main):014:0> eat[3] = 'MOS BUG' => "MOS BUG" irb(main):015:0> eat => ["Mcdonald's", "KFC", "BUG King", "MOS BUG"] ``` 第一行是宣告一個空陣列,然後接下來的每一行都是塞入一個值。 你也可以這樣寫,效果也是相同的: ``` irb(main):016:0> eat = [] => [] irb(main):017:0> eat << "Mcdonald's" => ["Mcdonald's"] irb(main):018:0> eat << 'KFC' => ["Mcdonald's", "KFC"] irb(main):019:0> eat << 'BUG King' => ["Mcdonald's", "KFC", "BUG King"] irb(main):020:0> eat << 'MOS BUG' => ["Mcdonald's", "KFC", "BUG King", "MOS BUG"] ``` `<<` 表示放一個東西進入陣列。 查看 `eat` 的資料型態會發現資料型態是 Array(陣列)。 ``` irb(main):021:0> eat.class => Array ``` 查看 `eat[0]` 的資料型態會發現資料型態是 String(字串)。 ``` irb(main):022:0> eat[0].class => String ``` 跟一般的變數一樣,輸入 `eat[2]` 可以取得他的內容。 ``` irb(main):023:0> eat[2] => "BUG King" ``` 但是你還可以這樣: ``` irb(main):024:0> bgk = 2 => 2 irb(main):025:0> eat[bgk] => "BUG King" ``` 也許現在還很難理解把 `2` 換成 `bgk` 會有什麼好處,本篇結尾會說明。 # 雜湊陣列 在陣列中,我們學到可以用數字作為索引,而雜湊陣列則是把數字改成任何資料型態的變數。 雜湊陣列(Hash)是使用大括號作為定義: ``` irb(main):026:0> eat_hash = {} => {} irb(main):027:0> eat_hash[0] = "Mcdonald's" => "Mcdonald's" irb(main):028:0> eat_hash[1] = "KFC" => "KFC" irb(main):029:0> eat_hash[2] = "BUG King" => "BUG King" irb(main):030:0> eat_hash[3] = "MOS BUG" => "MOS BUG" irb(main):031:0> eat_hash => {0=>"Mcdonald's", 1=>"KFC", 2=>"BUG King", 3=>"MOS BUG"} ``` 你也可以這樣寫: ``` irb(main):032:0> eat_hash = {0=>"Mcdonald's", 1=>"KFC", 2=>"BUG King", 3=>"MOS BUG"} => {0=>"Mcdonald's", 1=>"KFC", 2=>"BUG King", 3=>"MOS BUG"} ``` 和陣列不同的是,雜湊陣列不需要從 0 開始。 而且雜湊陣列的特性是可以用不是數字的變數作為索引,其中最常用的索引是字串索引,舉例來說: ``` irb(main):033:0> kamigo = {} => {} irb(main):034:0> kamigo['Q'] = 'A' => "A" ``` 而這就是卡米狗學說話的核心原理。 卡米狗有一個很大的雜湊陣列,當有人教卡米狗說話時,我就會將關鍵字和要回應的內容儲存到雜湊陣列裡,像這樣: `kamigo[關鍵字] = 要回應的內容` 之後任何人說話,我就會去檢查 `kamigo[關鍵字]` 是不是有值,如果有值的話卡米狗就會做出回應。 講到這,應該就知道為什麼索引可以用變數代換是一件很重要的事情了吧?