2006/12/20

Ruby 變數, 決策 及迴圈

今天也學了 Ruby。

Ruby 的變數

在程式語言中很重要的變數,在 Ruby 中是怎樣呈現呢?
答案是物件。他將每個變數都視成物件,這跟 Java 有點像 (另一個我在學的語言)
但是 Java 好歹還有 Primitive Data Type (原始資料型態),例如 int i = 9;
這個 i 並不是物件,他脫離了物件導向的精神,而有一些人就在這地方批評 Java 不夠 OO。

Ruby 呢?連數字都是個物件!
比方說 -111.abs 是一個 -111 的 Numeric 物件,呼叫其 abs (取絕對值) 方法,結果是 111。
而 47.6.round 是四捨五入方法 (類似還有 .ceil 取>=的整數, .floor 取<=的整數)
而字串當然不必說,跟 Java 一樣同屬物件。 (ex: 'Hello World'.split)
Ruby 的變數型別比較特別。不需要事先定義變數型別 (ex: Java 的 int i;)
只需要 i = 2 就可以直接使用。而變數依類型也有分:

Constant 常數 : 變數的第一個字元大寫就是了 (ex: PI)
Local Variable 一般變數 : 變數第一個字元小寫就是了 (ex: name)
Global Variable 全域變數 : 變數前加上 $ 錢字符號 (ex: $path)
Instance Variable 實體變數 : 變數前加上 @ 小老鼠 (每個物件生成之後自有的變數)
Class Variable 類別變數 : 變數前加上 @@ 兩隻小老鼠 (物件所屬的類別共有的變數)

其他還有一些事先定義過的符號,因為很難懂所以暫時不提。

Ruby 的決策

說穿了就是其他程式語言的 if - else 而已,Ruby 當然有:

name = 'Tom'
if name == 'Tom'
  p 'Hello Tom, long time no see!'
elsif name == 'Kevin'
  p 'Oh, Kevin. You lent me some money before!'
else
  p "Hey! Your name is #{name}. Isn't it?"
end


需要注意有幾點:

elsif : 不像 Java 的 else if 或是 VB 的 ElseIf,這跟 Perl 的 elsif 一樣
區塊 : 不必跟 C/Java 一樣加大括號,直接打即可,也不必在敘述末加分號
${XXX} : 適用於雙引號時。將變數 XXX 插入字串,跟 PHP 的 "$XXX" 有異曲同工之妙
end : 記得完整的決策是以 end 收尾

除了一般看到的 if,也有變種: (將 if 放在敘述後面)

p 'Long time no see!' if name == 'Tom'


以上一行敘述也可以這樣寫:

if name == 'Tom' then p 'Hello' end


是不是不太一樣呢? Ruby 跟 Perl 有一樣的優點,同一件事可以有多種不同的寫法。
對了,差點忘記方便的三元運算子 ? : , Ruby 也有。

p (name=='Tom' ? 'Long time no see!' : 'Nice to meet you.')


至於方便的 switch,在 Ruby 中叫做 case (就是 switch 裡面的 case 嘛)

case name
  when 'Tom'
    p 'Great'
  when 'Ken'
    p 'Friendly'
  else
    p 'so so'
end


case 後面加的是判斷變數,不像 Java 只支援整數, Ruby 也可以接受文字等。
而且 switch...case 的 case 在 Ruby 用的是 when,而每個 when 判斷之後不必加 :,
而且區塊也不必加什麼 break; 。

Ruby 的迴圈

先從 for 迴圈來吧:

for i in 1..10
  print '*'*i, "\n"
end


以上的意思是讓 i 從 1 跑到 10,而 '*' * i 的意思是讓星號重複 i 遍,
最後再輸出換行字元 (print 可接受多個字串一同輸出),執行結果會印出一個三角形。

當然有其他做法:

10.times{ |i|
  print '*'*(i+1), "\n"
}

以上利用 10 這個 Integer 物件 (隸屬於 Numeric 類別)的 times 方法來跑迴圈,
共跑 10 次,而利用 |i| 方式指派一個 i 變數計數器。會從 0 變到 9。
如此就可以拿來利用。

方法永遠不會只有一種,這在 Ruby 實在是很明顯:

1.step(10){ |i|
  print '*'*i, "\n"
}


以上使用 1 這個隸屬於 Numeric 類別的方法 step 步進跑迴圈。
其中 1 是初始值, .step 內的 10 是結束值,讓 i 這個計數器從 1 跑到 10。
這跟第一個迴圈是相同的。

礙於篇幅只能介紹這些,其實還有 while 迴圈可以用,相關用法可以自行尋找啦。

延伸閱讀:
  • http://www.ruby-doc.org/docs/ruby-doc-bundle/Manual/man-1.4/syntax.html
    雖然是 1.4 版的過時文件,但其內容相當完整,適合初學者
  • http://www.ruby-doc.org/core/
    類似 Java API 的玩意兒,很完整
  • http://sitekreator.com/satishtalim/index.html
    隨著教學章節開始一步步進入 Ruby 的世界

2 則留言:

  1. Ruby跟Python有很多相似的地方...去看看吧
    http://blog.ianbicking.org/ruby-python-power.html

    其中Closure部份讓我沒有什麼動力去學這兩種語言呢
    倒是Lua比較吸引我

    回覆刪除
  2. 個人認為 Ruby 還算滿簡單易學的,我花不到一週就將基本的語法給上手了。
    (汗...基本語法如果不熟那後面還玩啥XD)
    最主要是衝著 RoR 才會想學的啦。

    Python 啊...感覺也不錯,但是目前而言大概也用不到。

    回覆刪除