iT邦幫忙

2021 iThome 鐵人賽

DAY 4
0
自我挑戰組

從 Ruby 到 Rails,從素人到轉職系列 第 4

Day 4 Ruby 變數與資料型別 Variable and Data Type

寫在前面

因為發現昨天在講基礎運算子的時候很多地方需要先知道變數跟資料型別,所以今天趕快來補充一下。真的是越寫會越發現程式語言的每個知識都是環環相扣的,缺一不可,但是學習的順序又很難拿捏。可能就是全部一起看過去,當你在實作的過程中就會發現這一路上所學的會全部串在一起!

變數

變數就像姓名貼紙一樣,可以讓我們簡單的叫出某個資料。就像是一個人會有很多特質,高矮、胖瘦、生理性別、膚色髮色...等,但如果每次要叫一個人就要把她所有特質都叫出來才能"呼叫"那個人,感覺就有點累、有點沒效率吧?所以我們出生的時候,有人會幫我們取名字,長大之後偶爾還會有綽號出現。這個取名的過程就像是變數宣告一樣,把你這個人指定給這個名字,以後只要叫到這個名字就是在說你啦!!!!

通常 Ruby 裡面的變數都是小寫英文字或 _ 開頭,不過你如果要用中文或 Emoji 來當變數名稱也是可以的,只是會有點... 奇妙。 BUT!!! 在 Ruby 裡面變數是不能用數字開頭的。變數的命名是一門大學問,通常要注意可讀性,要把讀你的 Code 的人想像成對這個專案完全沒有背景的人,如果他也能看懂的話就代表是個好懂的 Code。

還有個很重要的東西忘了提!那就是在 Ruby 裡面英文大小寫是不一樣的唷!

> aBc = 123
=> 123
> aBc
=> 123
> abc
NameError (undefined local variable or method `abc' for main:Object)

昨天有說過我們在宣告變數的時候用的是一個等號,等號的左邊就是那個"名字",等號的右邊就是你想要連結的資料。
像是:a = 123 就是把 123 這串數字指定給 a 這個變數,所以你下次呼叫 a 的時候就會跑出 123 囉。

Ruby 裡的變數可以簡單地分成四種:

  1. 區域變數 Local Variable (變數前面不帶前綴)
  2. 實體變數 Instance Variable (變數前面加 @)
  3. 類別變數 Class Variable (變數前面加 @@)
  4. 全域變數 Global Variable (變數前面加 $)

就我目前的觀察,在寫 Ruby on Rails APPs 剛開始最容易碰到的是前面兩個,後面兩個可能要等我功力比較高深之後才會慢慢碰到吧。

這四種變數最大的差異就是作用的範圍,
區域變數(英文其實是"當地"變數?)顧名思義就是只能在你那個小區域裏面作用,像是之後會提到的類別或方法的 block 裡面,如果還沒宣告就直接呼叫的話,會跳出NameError (undefined local variable or method 'l' for main:Object) 的命名錯誤。
實體變數則是可以存活在你新建了的一個類別實體裡面,另外如果你在還沒宣告實體變數的狀況下呼叫的話,會回傳 nil (空值,之後會提到)
(關於類別跟實體只能留待後面解釋,所以類別變數在這邊就先跳過)
全域變數就是照字面上說的一樣在哪裡都可以用啦!但是建議不要輕易使用全域變數,很容易就會造成汙染或是讓整個環境變得非常複雜。全域變數也是在還沒宣告的狀況下呼叫會回傳 nil 的。

資料型別

Ruby 的資料型別可分為下面幾種

  1. 數字 Number
    包括整數 Integer、浮點數 Float、小數 Decimal(浮點數跟小數的差別可以另外寫一篇說明XD)
    總之就是自帶一些運算功能的資料,可以跟我們想像的一樣做加減乘除
    但是浮點數在計算上會有一些問題,不是那麼精準,至於為什麼會這樣,要如何解決,就等之後一起說明囉,好奇的朋友們可以先在 irb 裡面試試看 > 0.1 + 0.2 看會得出什麼結果。
  2. 字串 String
    " " 包起來的資料,所以 "123" 也是屬於字串而不是數字喔!
  3. 布林值 Boolean
    truefalse

陣列、雜湊、符號會在之後更詳細的說明,現在先來說說一些有關宣告的東西

  1. 陣列 Array
    [ ] 包起來的一串東西,具有順序性,不同的項目要用逗號隔開,,裡面可以是各種資料,甚至可以是另一個陣列
> a = []
> b = [123]
> c = [123, "123", "abc"]
> d = [123, 123, 123]
> e = [nil, 123, [1, 2], {abc: 123}, :abc, true]
> 以上都是可以的唷
  1. 雜湊 Hash
    { } 包起來的一串東西,裡面會有 key 跟 value 的組合,key 會是符號或是字串, value 則是各種資料型別都可以,key 跟 value 會用 => 來隔開,但是 Ruby 現在的版本讓我們可以比較直覺方便的宣告 Hash,所以可以直接用 : 來隔開,就會有一樣的效果
> a = {:abc => 123}
> b = {abc: 123}
> c = {a: 1, b: 2}
> d = {"abc" => 123, "def" => [1, 2, 3], "g" => nil, "e" => true}
> e = {abc: 123, def: 123, g: nil, e: true}

其中要注意用符號當 key 跟用字串當 key 是代表不同意思的。另外在宣告時如果是用 {"abc": 123} 則 key 會直接從字串轉換成符號。還有 Hash 裡面的 key value 組合是沒有順序性的。

  1. 符號 Symbol
    這是一個跟字串有點像的東西,之後會特地拉一天來解釋這個東西,因為真的有點難懂。
    現在先知道有 : 開頭的就是符號,像是 :abc, :good 這種資料,Hash 的 Key 通常也會選擇使用符號

  1. 空值 nil
    空值就是什麼都沒有的意思啦!要注意的是如果你輸入空字串、空陣列、空雜湊,他們都不會是沒有喔,他們都還是存在喔(是不是很玄!!!!?)這個沒有就是真的沒有(到底在說什麼?)反正就是...nil 代表著一個不存在(很像還是沒有懂)呃... 讓我們繼續看下去

另外值得一提的是在 ruby 裡面,會被當作 false 的就只有 false 本身還有 nil,其他所有資料都會被當作 true(不管是空字串、空陣列、空雜湊都是真的啦!都是存在的啦!)(是不是覺得我瘋了?)

> nil == ""    # false
> nil == []    # false
> nil == {}    # false

寫在後面

開始真正進入 Ruby 之後就發現之前很像真的學了一些東西,然後真的是環環相扣環環相扣扣扣扣扣啊!!!!! 寫到一半都會發現:啊,這個也要寫一下,啊,那個很像不解釋這邊會變很奇怪,那就等我繼續讓文章們堆疊出來之後再來做整理了... 如果有哪裡說錯的歡迎留言給我跟我說,畢竟我也還是個孩子啊!


上一篇
Day 3 Ruby 基礎運算子
下一篇
Day 5 用 Ruby 印東西
系列文
從 Ruby 到 Rails,從素人到轉職6

尚未有邦友留言

立即登入留言