mingyuhung

35 Flips | 3 Magazines | 1 Following | @mingyuhung | Keep up with mingyuhung on Flipboard, a place to see the stories, photos, and updates that matter to you. Flipboard creates a personalized magazine full of everything, from world news to life’s great moments. Download Flipboard for free and search for “mingyuhung”

mature-bears-and-other-wonders:

文件

試玩 Ruby!針對新手的互動式教學。讓你可以在瀏覽器中試玩 Ruby,體驗用 Ruby 寫程式的感受。Ruby KoansRuby Koans 導引你走上學習 Ruby 的啟蒙之路。可以學到 Ruby 語言、語法、結構、常用函數與函式庫。 當然也少不了 Ruby 的文化。RubyMonk …

Ruby 使用手冊 | 甚麼是 Ruby?

Ruby 是「用於快捷易用物件導向程式設計的直譯式腳本語言」--這是甚麼意思呢?<p><i>直譯式腳本語言 (interpreted scripting language):</i><p>能夠直接產生作業系統呼叫<br>• 強大的字串處理 (string operations) 及正規表示式 (regular expressions)<br>• 在 …

起步走

首先,看看是不是已經安裝了 Ruby (若沒有安裝,請參考下面的編註)。在 shell 提示符後(即 "%",不要再輸入 %了),輸入<p>% ruby -v<p>(-v 會通知直譯器顯示 Ruby 的版本),然後按下 <i>Enter</i> 鍵。如果已經安裝 Ruby,就出現以下訊息:<p>% ruby -v<br>ruby 1.8.3 …

簡單示範

來寫個函式計算階乘吧。n 階乘的數學定義是:<p>這可在 Ruby 中寫成:<p>def fact(n) <br>if n == 0 <br>1 <br>else <br>n * fact(n-1) <br>end<br>end<p>你會發現 end 重複出現, Ruby 正是因此而稱為類似「算法」(Algol) 的語言。(其實,Ruby 的語法更接近 Eiffe …

字串

Ruby 可用於處理字串與數值資料。字串會用雙引號 ("...") 或單引號 ('...') 括起。<p>ruby> <b>"abc"</b> <b><br>"abc"</b><br>ruby> <b>'abc'</b> <b><br>"abc"</b><p>不同情況下,雙引號與單引號會有不同效果。用雙引號括起的字串可利用前導的反斜線逸出 (escape) 字元,或是使用 #{} 來計算裡面的程式 …

正規表示式

來編寫更有趣的程式吧。這一次我們使用一個簡潔精準的<i>樣式 (pattern)</i>來測試一個字串是否符合描述。<p>這些樣式中,有些字元及字元組合具有特殊意思,包括:<p>指定的範圍(例如:[a-z] 表示一個在 a 到 z 的範圍內的字母)<p>\w<p>一般字元 (word character),即 [0-9A-Za-z_]<p>\ …

陣列

你可以在 ([]) 中列出幾個項目建立一個<i>陣列 (array)</i>,用逗號隔開項目。Ruby 的陣列能夠容納各種型別的物件。<p>ruby> <b>ary = [1, 2, "3"]</b> <b><br>[1, 2, "3"]</b><p>陣列與字串一樣,能夠串接與重複。<p>ruby> <b>ary + ["foo", "bar"]</b> <b><br>[1, 2, "3", "foo</b> …

繼續簡單示範

現在我們來分析一下之前的程式範例。<p>下列程式碼在簡單示範一節中出現過。<p>def fact(n) <br>if n == 0 <br>1 <br>else <br>n * fact(n-1) <br>end<br>end<br>puts fact(ARGV[0].to_i)<p>因為這是我們第一次解釋,所以每一行都會仔細說明。<p>階乘<p>def fact(n)<p>第 1 行中, …

控制結構

本節將探討 Ruby 的控制結構。<p>case<p>我們用 case 敘述來測試一連串條件,初看與 C 及 Java 的 switch 相似,但我們之後就會發現 Ruby 的 case 效果更為強大。<p>ruby> <b>i=8</b><br>ruby> <b>case i</b> <br>| <b>when 1, 2..5</b> <br>| <b>puts "1..5"</b> <br>| <b>when 6.</b> …

迭代器

迭代器 (iterator) 並不是 Ruby 的原創概念, 這已在物件導向程式語言中普遍使用。它也被用在 Lisp 中,只是並不稱為迭代器而已。然而很多人仍然不熟悉迭代器的概念,因此以下將詳細解釋。<p><i>迭代 (iterate)</i> 指的是重複做相同的事,所以<i>迭代器 (iterator)</i> 就是用來重複多次相 …

物件導向思維

方法

甚麼是方法?物件導向程式設計中,我們不希望直接在物件以外處理資料,相反地,物件本身應了解自己如何運作(當你友善地請求它去做事情時)。你可以這樣想,我們把訊息傳給物件,物件就會作出某些動作或有意義的回應。我們不需要了解或關心物件內部實際如何運作。這個允許我們要求物件執行的工作(或者說,這個物件可以了解 …

類別

這個世界充滿著物件,我們都能把它們分門別類。例如,小孩子看到狗,不管是甚麼品種,可能都會叫牠作「汪汪」;我們自然地就會把世界的不同物件歸類。<p>物件導向程式語言的術語中,像「狗」這種類型,我們會稱為<i>類別 (class)</i>,而屬於該類別的物件就稱為<i>實例 (instance)</i>。<p>在 Ruby 或其他物件導向程式 …

繼承

日常生活中的物件類別都會分有階層, 我們知道<i>所有貓都是哺乳類</i>,<i>所有哺乳類都是動物</i>。較小的類別會<i>繼承 (inherit)</i> 具有所屬較大類別的特徵。如果所有哺乳類都會呼吸,那麼所有貓也會呼吸。<p>我們可以在 Ruby 表達這種概念:<p>ruby> <b>class Mammal</b> <br>| <b>def breathe</b> <br>| <b>puts "</b> …

重新定義方法

在子類別中,我們重新定義父類別方法,就能改變實例的行為。<p>ruby> <b>class Human</b> <br>| <b>def identify</b> <br>| <b>puts "I'm a person."</b> <br>| <b>end</b> <br>| <b>def train_toll(age)</b> <br>| <b>if age < 12</b> <br>| <b>puts "Reduced fare.";</b> <br>| <b>else</b> <br>| …

存取控制

之前我們說過,Ruby 沒有函數,只有方法。但 Ruby 有不只一種的方法, 本節將介紹<i>存取控制 (access controls)</i>。<p>如果我們在「最高層級」(top level) 定義方法,而不是在類別中定義,那會怎樣呢?我們會發現這個方法與 C 這種傳統語言中的<i>函數 (function)</i> 相似。<p>r …

單件方法

ruby> <b>class SingletonTest</b> <br>| <b>def size</b> <br>| <b>25</b> <br>| <b>end</b> <br>| <b>end</b> <b><br>nil</b><br>ruby> <b>test1 = SingletonTest.new</b> <b><br>#<SingletonTest:0xbc468></b><br>ruby> <b>test2 = SingletonTest.new</b></b> …

模組

Ruby 的模組 (module) 與類別相似,除了:<p>模組並沒有實例。<br>• 模組並沒有子類別。<br>• 模組由 module ... end 定義。<p>其實⋯⋯模組的 Module 類別正是類別的 Class 類別的父類別。懂嗎?不懂?繼續看下去吧。<p>模組有兩種用法, 一種將各式相關的方法與常數 (constant)收集 …

程序物件

當有意料之外的事件發生時,誰都希望能夠有指定的回應措施。這其實很簡單,只要我們能夠將程式碼區塊如引數般傳至其他方法,也就是能夠像使用 資料 般一樣對待 程式碼。<p>使用 Proc.new 創造一個新的<i>程序物件 (procedure object)</i> (編註:原英文版使用 proc 方法,現在的慣例改成使用 …

變數

全域變數

全域變數以 $ 開頭, 可從程式中任何地方開始。初始化前,全域變數有一個特別的值--nil。<p>ruby> <b>$foo</b> <b><br>nil</b><br>ruby> <b>$foo = 5</b> <b><br>5</b><br>ruby> <b>$foo</b> <b><br>5</b><p>應儘量少用全域變數, 因為全域變數能夠編寫於任何地方,所以相對危險。過量使用全域變數會令人難以找出錯誤,也會讓人覺得程式設計並沒經過深思 …

實例變數

ruby> <b>class InstTest</b> <br>| <b>def set_foo(n)</b> <br>| <b>@foo = n</b> <br>| <b>end</b> <br>| <b>def set_bar(n)</b> <br>| <b>@bar = n</b> <br>| <b>end</b> <br>| <b>end</b> <b><br>nil</b><br>ruby> <b>i = InstTest.new</b> <b><br>#<InstTest:0x83678></b><br>ruby> <b>i.set_foo(2)</b> …

區域變數

區域變數 (local variable) 以小寫字母或底線字元 (_) 開頭, 與全域變數及實例變數不同,區域變數初始化前並沒有 nil 值:<p>ruby> <b>$foo</b> <b><br>nil</b><br>ruby> <b>@foo</b> <b><br>nil</b><br>ruby> <b>foo</b> <b><br>ERR: (eval):1: undefined local variable or met</b> …

類別常數

常數都是以大寫字母開頭, 最多獲指派一個值。在 Ruby 中,重新指派一個常數,會出現警告而不是錯誤(eval.rb 的非 ANSI 版並不會出現警告):<p>ruby><b>fluid=30</b> <b><br>30</b><br>ruby><b>fluid=31</b> <b><br>31</b><br>ruby><b>Solid=32</b> <b><br>32</b><br>ruby><b>Solid=33</b> <b><br>(eval):1: warni</b> …

例外處理:救援

執行中的程式可能出現意料之外的問題。例如:發現要讀取的檔案不存在;儲存資料時發現磁碟已滿;輸入不合適的內容。<p>ruby> <b>file = open("some_file")</b> <b><br>ERR: (eval):1:in `open': No such file or directory - some_file</b><p>穩健的程式 …

例外處理:確認

方法完成工作後,可能需要作出一些清理動作, 像是關閉打開的檔案;清理緩衝的資料等。如果每個方法都只有一個退出點 (exit point),我們就可以把清理的程式碼放於一個地方,也能確定它會執行工作。但是,一個方法可能從不同地方傳回,或因為例外,使我們的清理程式碼意外跳過 (skip)。<p>begin <br>f …

存取器

甚麼是存取器?<p>我們曾在之前的章節討論過實例變數,但尚未深入探討。物件的實例變數即是物件的屬性 (attribute),用以區分出同類別的其他物件。能夠讀寫這些屬性非常重要,若要讀寫便需要稱為<i>屬性存取器 (attribute accessors)</i> 的公開方法(編註:所有實例變數都不公開的,除非透過公開 …

物件初始化

上一節中的水果 (Fruit) 類別具有兩個實例變數,一個用來描述水果的種類,一個用來描述水果的狀態。為該類別編寫了自訂的 inspect 方法後,我們才發現如果水果沒有這些特徵,就會顯得很不合理。幸好 Ruby 有方法能夠確保實例變數總是能夠初始化 (initialize)。<p>initialize …

基本要素

本節主要討論一些實作事項。<p>敘述分隔符號 (statement delimiter)<p>有些語言需要某些標點符號(例如分號 (;))來結束程式中的每個敘述, 而 Ruby 則是根據 shell 的傳統,例如 sh 及 csh。同一行上的多項敘述必須以分號來分隔,但並不需要在該行結尾處使用,換行字元 (li …