2008年4月4日 星期五

Ruby簡介--Ruby on Rails 完全新手手冊


既然我們要玩的東西就是Ruby onRails,那麼了解ruby就是必然的事了。
那麼就讓我來簡單的介紹一下ruby這個玩意兒!
不過在開始之前,先來說明一下有兩種不同的環境可以選擇:其一是利用irb,一行一行撰寫程式碼,可以即時的從視窗中看到執行的結果;另一種就比較像是一般的程式語言一樣,先撰寫好程式碼,存成.rb檔,然後在執行 ruby xxx.rb就可以看到執行的結果。(注意:這裡的兩種方法都是在文字命令列下執行)在這裡推薦使用irb來玩會比較有趣^^。

基本輸入/輸出

puts, print / get
print=>輸出文字不換行
puts=>輸出文字且換行
printf=>同C的printg
demo:
puts "Hello World!!"
print "Hello"
print "World!!"
printf("Number: %5.2f,\nString: %s\n", 1.23, "hello")

get=>從鍵盤取得輸入的串流(含換行符號),如果沒有可以切受return的值,則會把值丟到$_
chomp=>將變數$_去掉尾部的換行符號
demo:
lines = get
puts line


由上面幾個簡單的例子我們可以有以下這些發現
1.method的括號可以省略不寫
2.method必有返回值(nil或是值)

基本資料型態

numbers/strings/ranges/regular expressions
數字(number) => 分為fixnum與bignum
字串(string) => 就是字串
範圍(range) => 一個遞增的範圍像是1..5、A..B,則分別表示{1, 2, 3, 4, 5},{A, B};若是三個點則為不包含最後的數(值)ex:1...5表示{1, 2, 3, 4}
*正規表示式(
regular expression) => 還蠻有趣的東西...晚點再來討論
demo:
num = 11
num = 99999999999999999999999
num = 0x6C #hex
num = 0r100101 #binary
num = 045172 #octal
num = 123_456_789 #123456789
rg = 1..5
rg == 5 #false
rg === 5 #true
rg = "abc".."abe" #{"abc", "abd", "abe"}
str = "#{'Ho! '*3} Merry Christmas!" #Ho! Ho! Ho! Merry Christmas!
str = "say \"Hello\"" #say "Hello"
str = "Hello " + "World!!"
str = 'Hello World!!'

基本流程控制

if..elsif(elseif)..else => 基本上要寫elsif才對,但式測試後發現elseif也可以過XXD
unless => if 的反敘述
case..when..else => 同C的swicth..case..default
while/until
for..in => 同for each語法
break/next/redo/retry =>限迴圈中使用,跳出/跳至下一個/再次執行同一個/重新執行迴圈(從頭)
demo:
def get_time(clock)
if clocck < clock ="=">
+clock.to_s+'點'
end
end
####我不是分隔線#####
count=0
for value in 1..10
count+=1 until value%2==1 #count+=1 if value%2==0
end
####我不是分隔線#####
score = 70
str = score>60?'passed':'not pass'

Array and Hash 陣列與雜湊

關於array基本上和我們平常在用的array差不多,所以基本的就不談了,來談談在Ruby中的array到底有什麼特別的地方。那麼首先來舉個例子:
a = [123, 9.8765, "LOVE"]
上述敘述將有三個元素的array指定給a,在Ruby中不同型態元素的array是允許的。接下來測試一下:
puts a[1] #9.8765
puts a.class #Array
puts a.length #3
puts a[3] #nil
puts a[-1] #LOVE
puts a[-4] #nill

從這邊我們可以看到有負數的索引值在,在array中索引-1代表的是陣列最後一個元素,-2則是倒數第二個元素...依此類推,長度為n的陣列第一個元素的index可以為-n或是0。而只要是沒有被assign值的地方將回return nil值。而這個陣列本身的長度為動態的,如果我們現在指定a[4]=99,那麼我們可以看到 a.length將會變成5,a[3]依然是nil。這在邊我們就可以發現到幾個要比較小心來處理的地方:因為負數的index可能有意義,要小心處理其範圍;如果讀到nil值不代表已經走到陣列邊界,包含nil這個元素的array是合法的。使用length屬性或是for each來處理可能較不容易出錯。

另外array也可使用雙index,其意義為Array[起始index, 元素個數]。也就是說,a[3]與a[3, 1]所得到的值是相同的。這邊有個array a=[1, 3, 5, 7, 9],則a[1, 3] = {3, 5, 7};a[-4, 2] = {3, 5}而不是{3, 1},元素個數都是從start index開始抓後面的元素。而多為陣列表示法則為[a][b]...[n]。

依照上面的想法,同樣的我們可以在array中使用range來做index。例如a[1..3]={3, 5, 7};負數Range也可以,不過切記range必須是要遞增的。
後註:array裡面同樣也可以塞array喔!依此觀念就能很容易實作長度不為一的多為陣列;a=["a", "b", "c"] => a=%w{a, b, c}

在Hash這邊我們先來看一個範例
my_favor = {
'animal' => '小雞',
'book' => '遊戲說明書',
'game' => '風色幻想',
'CD' => '天使領域 OST'}
測試一下,puts my_favor['CD'] #
天使領域 OST;puts my_favor.length #4
感覺還蠻簡單的不是嗎?陣列就有點像是比較tightly hash,限制了index的表示法。而相較之下hash的index就叫為多元化,數字與字串都可以做為index,如果能運用的恰當,則可增加成式的可讀性^^。

續待
iterator, block, class

沒有留言: