開宗明義地說吧! 撰寫此文件是為了吸引正在學習其他程式語言的人前來學習 Ruby, 高階語言的發展至今已經數十載, 而這些發展的目標, 都是要讓人腦能夠以更快速更簡單的思維, 以更短的時間去達成想要完成的事情, 而現在程式設計的紅寶石出現了 - Ruby 將帶給你全新的程式設計體驗!
談到 Ruby 程式語言, 就不得不先提到他的物件導向 ( Object-Oriented,程式設計人員習慣簡稱 OO ) 技術, 相較於前期的里程碑 JAVA, Ruby 的物件導向更加徹底, 而且使用起來也較其他物件導向語言更加方便; Ruby 本身更內建了很多方便的方法 ( Built-in Method ) , 可讓程式開發的速度更加直覺以及口語化. 但所謂「口語化」也得在粗略地懂一些英文的前提之下才能成立.
如果您是 Perl 或是 Python 的使用者, 那麼恭喜您, 因為 Ruby 也同樣完整提供了常規表示法 ( Regular Expression ) 的支援, 並且使用上更加容易. C 的使用者也可以享受 Ruby 特有的內嵌功能, 讓共享變數以及方法更加容易, 可以更快達成目標.
不過, 在此不建議沒有任何程式設計基礎的學習這套語言, 正因為 Ruby 過於物件化, 以至於常讓沒有 OO 甚至程式基礎的人裹足不前, 而在 Ruby 之中的變數 ( Variables ) 觀念也常常會有誤解, 所以如果您沒有任何的程式基礎, 希望您可以學一點點 C++, 至少學到參考 ( Reference ) 的概念, 才能了解 Ruby 的內部真正的運作方式. 在寫程式遇到錯誤時也能夠加快偵錯的腳步.
如您所見,都是物件
如果您擁有程式設計的基礎, 那麼事不宜遲, 我們馬上來介紹 Ruby 對最大特色 :” Everything’s an object! ” 字串本身是個物件, 數字本身是個物件, 連常規表示法本身也是個物件.
"munouzin".size # 8
123.integer? # TRUE
/(.)(.)(.)/.match("abc")[2] # "b"
Ruby 沿襲了近代 OO 語言的最大特點: 無法多重繼承. 此一規範包括了 Java 和 ObjC 都遵循了, 這是確保物件導向更加嚴謹的設計, 以避免多個被繼承的物件有相同的方法或是屬性而造成衝突, 這就像是一個小孩可以有好多個養父, 卻只會有一個親生父親是一樣的道理. 關於這點在此不贅述, 只要記得「一個物件只能夠選擇繼承一個物件」這樣的單一性即可.
當然「四海之內皆物件」這句話也不是絕對的, 在 Ruby 之中, 沒辦法稱上物件的就是變數本身了. 這是因為 Ruby 的變數不像 C 一樣有個固定的型態, 而是同近年來蓬勃發展的命令稿語言 ( Script Language ) 所採用的參考 ( Reference ) 法, 也就是說:
myname = "munouzin" # "munouzin"
mycopyname = myname # "munouzin"
myname[0] = "o" # "o"
myname # "ounouzin"
mycopyname # "ounouzin"
打鐵趁熱, 所以我們趕快避開這個嚴肅冷門的問題, 留到以後討論, 再介紹幾個 Ruby 物件化之後所帶來的方便吧:
#!/usr/bin/env ruby
5.times do |i|
p i
end
你猜, 輸出的結果會是什麼?
0
1
2
3
4
這個範例告訴我們幾個特點:
Ruby 換行不需要分號 ( ; )
Ruby 的迴圈也是使用物件的方法呼叫的
Ruby 的偵錯輸出可使用 “p” 陳述式, 可節省很多時間
是的, 不過如果你對於這樣的迴圈使用無法適應的話, 沒關係, Ruby 提供你絕佳的適應環境: 類 Basic 語言陳述式.
#!/usr/bin/env ruby
for i in 0..4
print i
end
這跟上面那段程式的效果是一樣的. 當然如果能夠習慣使用 p 來代替 print 更可以快速上手, 但要注意的是:
p 會將物件詳細類型資訊輸出, print 只會顯示資料內容.
p 每執行一次就會換行, print 卻不會.
至於 p 或是 print 的詳細使用方法, 將在隨後的章節向您介紹.
偷偷告訴你:Ruby 直接支援大數運算!
執行緒的新面貌 ( Threads )
看完上面大篇幅的介紹也許你會覺得: 豈有此理, 但是對於 C++ 或是其他語言的使用者, Ruby 的方便性確實令人忌妒 ( 笑 ). 然而隨後你所看到的, 將是為什麼 Ruby 敢說自己 “Everything’s an Object!” 的一大原因.
#!/usr/bin/env ruby
# Refer to Programming Ruby
# Copyrights 2001 by Addison Wesley Longman, Inc.
threads = []
6.times { |i|
threads << Thread.new(i) {
raise "Boom!" if i == 3
p i
}
}
threads.each {|t| t.join }
談到多工不外乎會牽扯到多執行緒的麻煩手續, 現在 Ruby 將執行緒物件化了. 輸出的結果:
0
1
2
4
5
loop.rb:5: Boom! (RuntimeError)
from loop.rb:9:in `join'
from loop.rb:9
from loop.rb:9:in `each'
from loop.rb:9
說明一下 raise 陳述式的功用, 他是能產生正式 Runtime Error 的「工具」, 通常一旦 error 程式將不會繼續執行, 但是我們在這裡用 Thread 物件新增了一個子執行緒, 當他 error 時, 因為母執行緒並沒有錯誤產生, 所以其他的子執行緒依然可以照常執行, 而執行緒最常見的地方便是網路程式設計了, 因為伺服端的應用程式並不可以因為等待連線, 將其他的工作擱置一旁, 否則的話就永遠只有一個人能夠享用此 server 的服務, 因此善用執行緒物件 - Thread 可以讓您在寫作多人伺服程式時, 更加得心應手.
有關子執行緒的攔截, 以後的章節再來詳細說明. 至於為什麼可以使用 raise “Boom!” if i == 3 這樣「口語化」的陳述式, 又為什麼會有 Thread 這樣好用的物件? 我只能告訴您這就是為什麼我選擇 Ruby.
題外話:Ruby 並不是第一個使用這種 pure-OO 概念的語言, 事實上 Ruby 的物件導向模式也是參考 Smalltalk 語言來設計的, 若您有興趣可以參考一下.
圖形介面設計 - Ruby TK

不需多說, 這就是用 Ruby 寫的圖形介面程式. ( 執黑子的是我, 不要笑我 )
當然, 這不是我寫的, 請看原始檔案 ( 11KB )
原作者為 maeda shugo
, 這個檔案內附在 Ruby-mswin32 版本. 當然其中也內附 TK.
Linux 下的使用者在編譯時只要加選 TK 就可以輕鬆撰寫圖形介面程式了.
Microsoft Windows 的支援
對於微軟的愛用者而言這恐怕是一大福音吧, 然而拋開自由軟體所處的立場而言, Ruby 這樣的相容性是很能展現誠意的.
require 'win32ole'
ie = WIN32OLE.new('InternetExplorer.Application')
ie.visible = true
ie.gohome
又是不需多說的一節, 一起來動動腦猜猜會發生什麼吧.
紅寶石服務中心
一塊地再怎麼肥沃, 缺少了取用方便的水源也是枉然. 一個軟體功能再怎麼強大, 缺少了取用方便的資源也同樣令人扼腕. Ruby 體認到這點, 因此不管是文件、軟體或是社群, 都有官方的網頁可以參考. 從此之後可以不用辛苦地尋找想要的資訊囉!
Ruby 官方網站 ( 英 )
http://www.ruby-lang.org/en/
Ruby 官方網站 ( 日 )
http://www.ruby-lang.org/ja/
Ruby 官方文件 ( 英 )
http://www.ruby-doc.org/
RAA - 各種 Ruby 可以使用的函式庫和 Ruby 寫的程式都在這喔!
http://raa.ruby-lang.org/
RubyForge - 同上, 不過如同 SourceForge 一般有專案管理, 不用擔心抓不到東西了
http://rubyforge.org/