mingyuhung

34 Added | 2 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”

文件

試玩 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> 就是用來重複多次相 …

物件導向思維

<i>物件導向 (object oriented)</i> 是個引人注意的詞彙, 把東西稱為物件導向,讓人聽起來覺得很聰明。Ruby 宣稱為物件導向程式語言,但到底「物件導向」是甚麼意思?<p>答案各式各樣,但重點都是一樣。先不這麼快就下結論,讓我們先想想傳統的程式設計範式 (programming paradigm) …

方法

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

類別

這個世界充滿著物件,我們都能把它們分門別類。例如,小孩子看到狗,不管是甚麼品種,可能都會叫牠作「汪汪」;我們自然地就會把世界的不同物件歸類。<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 方法,現在的慣例改成使用 …

變數

Ruby 有三種變數、一種常數和兩個擬變數 (pseudo-variable)。變數與常數並不需要型別, 雖然無型別 (untyped) 的變數有一些缺點,但有更多優點,而且符合 Ruby <i>快捷易用</i>的理念。<p>大部分語言中,變數都需要宣告,才能指定型別、可修改性 (modifiability)(即,是不是 …

全域變數

全域變數以 $ 開頭, 可從程式中任何地方開始。初始化前,全域變數有一個特別的值--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 …

關於本手冊

• 日文原作由 Matz 所著。<br>• 首份英文版本由 GOTO Kentaro 及 Julian Fondren 翻譯。<br>• Mark Slagell 重新翻譯並加入新材料。<br>• 本中文版由 Ruby Taiwan 社群發行:由 Mason Chang 贊助初稿翻譯費用、Lok 完成初稿翻譯、ihower 技術編輯。