<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-3131360903311377656</id><updated>2011-04-21T17:53:00.414-07:00</updated><category term='ruby'/><category term='ruby guide'/><category term='ruby wikibook'/><title type='text'>Rock Say Ruby</title><subtitle type='html'>遊手好閒的石頭成整理的 Ruby 語言文件。&lt;br/&gt;
個人部落格: &lt;a href="http://blog.roodo.com/rocksaying/"&gt;石頭閒語&lt;/a&gt;</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://rock-say-ruby.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3131360903311377656/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://rock-say-ruby.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>rock</name><uri>http://www.blogger.com/profile/04065431701479848049</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>16</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-3131360903311377656.post-5457693470593408669</id><published>2007-06-11T19:38:00.000-07:00</published><updated>2007-06-11T19:41:25.358-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby guide'/><title type='text'>Ruby User's Guide::Inheritance</title><content type='html'>&lt;h3&gt;繼承&lt;/h3&gt;
English version: &lt;a href="http://www.rubyist.net/~slagell/ruby/inheritance.html"&gt;Inheritance&lt;/a&gt;

&lt;p&gt;
我們日常的個體分類系統是自然地階級分層。我們認知所有的貓都是哺乳動物，所有的哺乳動物都是動物。較小的類別繼承了具有分類歸屬關係之較大類別的特性。如果哺乳動物會呼吸，則貓就會呼吸。此一概念在 Ruby 中的表達方式如下例:
&lt;/p&gt;

&lt;textarea name="code" class="ruby"&gt;
class Mammal
    def breathe
        puts "inhale and exhale"
    end
end

class Cat &lt; Mammal
    def speak
        puts "Meow"
    end
end
&lt;/textarea&gt;

&lt;p&gt;
雖然我們未曾具體描述貓應該如何呼吸，但由於貓被定義為哺乳動物的子類別，故每一隻貓仍將繼承哺乳動物類的行為特徵。在個體導向的術語中，較小的類別稱為子類別(subclass)或衍生類別(derived class)，較大的類別稱為父類別(superclass)或基礎類別(base class)。因此從程序員的觀點看，貓自然會擁有呼吸的能力。在我們添加發聲方法之後，我們的貓就能呼吸與發聲。
&lt;/p&gt;
&lt;textarea name="code" class="ruby"&gt;
ruby&gt; tama = Cat.new
ruby&gt; tama.breathe
inhale and exhale
    nil
ruby&gt; tama.speak
Meow
    nil
&lt;/textarea&gt;
&lt;p&gt;譯注: tama 即「玉(たま)」的日文發音，日本人常常替小貓取這個名字。&lt;/p&gt;

&lt;p&gt;
有時候，特殊的子類別不能繼承父類別的某些行為特徵。舉例而言，一般的鳥類都會飛翔，但企鵝卻是一種不會飛的鳥類。在個體導向的術語中，我們稱這種情形是行為的特化或偏化。(譯注: 參考《&lt;a href="http://blog.roodo.com/rocksaying/archives/2659001.html"&gt;PHP 的參照及唯讀參照之實作&lt;/a&gt;》。雖然是 PHP 的文章，但其中的實踐內容非常適合說明繼承原則的特化與返祖化問題。)
&lt;/p&gt;
&lt;textarea name="code" class="ruby"&gt;
class Bird
    def preen
        puts "I am cleaning my feathers."
    end
    def fly
        puts "I am flying."
    end
end

class Penguin &lt; Bird
    def fly
        fail "Sorry. I'd rather swim."
    end
end
&lt;/textarea&gt;

&lt;p&gt;
我們不需要鉅細靡遺地定義每一個新類別的每一個行為特徵，僅需要增加或重定義子類別與父類別不同之處即可。這是繼承原則為個體導向編程所帶來的好處之一。
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3131360903311377656-5457693470593408669?l=rock-say-ruby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rock-say-ruby.blogspot.com/feeds/5457693470593408669/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3131360903311377656&amp;postID=5457693470593408669' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3131360903311377656/posts/default/5457693470593408669'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3131360903311377656/posts/default/5457693470593408669'/><link rel='alternate' type='text/html' href='http://rock-say-ruby.blogspot.com/2007/06/ruby-users-guideinheritance.html' title='Ruby User&apos;s Guide::Inheritance'/><author><name>rock</name><uri>http://www.blogger.com/profile/04065431701479848049</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3131360903311377656.post-6193249588120363034</id><published>2007-04-17T01:18:00.000-07:00</published><updated>2007-04-17T01:23:01.879-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby guide'/><title type='text'>Ruby User's Guide::Classes</title><content type='html'>&lt;h3&gt;
類別
&lt;/h3&gt;
English version: &lt;a href="http://www.rubyist.net/~slagell/ruby/classes.html"&gt;Classes&lt;/a&gt;
&lt;p&gt;
真實世界是由一個個獨立個體所構成，我們將這些獨立個體按其屬性、行為抽象化地分門別類，於是有了各種類(classes)。例如，當一名很小的小孩子看到一隻狗時，可能會說 "汪汪" ，而不關心它的品種。我們很自然地以分類方式看待天地萬物。
&lt;/p&gt;
&lt;p&gt;
在個體導向編程技術中，個體的種類，如「狗」，稱之為「類(class)」。歸屬於某一類的個體則稱為該類的實例(instance)。
&lt;/p&gt;
&lt;p&gt;
在 Ruby 或任何個體導向語言中，要建置一個體時，首先要定義類的特徵，然後建立一個實例。下例闡明此過程，首先定義一個簡單的 Dog 類。
&lt;/p&gt;
&lt;textarea name="code" class="ruby" cols="60"&gt;
class Dog
  def speak
    puts "汪汪"
  end
end
&lt;/textarea&gt;

&lt;p&gt;
在 Ruby 的關鍵字 &lt;code&gt;class&lt;/code&gt; 與 &lt;code&gt;end&lt;/code&gt; 之中的程式碼，即為類的定義內容。在此範圍中的 &lt;code&gt;def&lt;/code&gt; 定義了類別的方法 — 如&lt;a href="http://rock-say-ruby.blogspot.com/2007/03/ruby-users-guidemethods.html"&gt;前章&lt;/a&gt;如述，即對應於此類個體的具體行為。
&lt;/p&gt;
&lt;p&gt;
我們已經定義了 Dog 類，接著可以建立一個 dog (在 Ruby 的語言慣例中，首字母大寫者表示「類」，小寫表示類別的實例):
&lt;/p&gt;
&lt;textarea name="code" class="ruby" cols="60"&gt;
pochi = Dog.new
&lt;/textarea&gt;

&lt;p&gt;
我們做了一個 Dog 類的新實例，並命令為 pochi 。每個類別的方法 &lt;code&gt;new&lt;/code&gt; 可建立該類別的一個實例。因為 pochi 是 Dog ，根據我們的類別定義，它將具有我們賦予 Dog 類的一切特性。由於我們的想法非常簡單，在此我們僅能要求 pochi 玩一種把戲。
&lt;/p&gt;
&lt;textarea name="code" class="ruby" cols="60"&gt;
ruby&gt; pochi.speak
汪汪
&lt;/textarea&gt;

&lt;p&gt;
建立某類的一個實例又稱為類別實例化、具現化。我們需要有生命、有實體的狗，才能交談；我們不能要求狗類此一概念可以咆叫。
&lt;/p&gt;
&lt;textarea name="code" class="ruby" cols="60"&gt;
ruby&gt; Dog.speak
ERR: (eval):1: undefined method `speak' for Dog:class
&lt;/textarea&gt;

&lt;p&gt;
另一方面，如果我們想要聽見一隻狗的叫聲而不在乎那條狗的存在，我們可以創造一隻暫時性的狗，讓它發出聲音後就消失。
&lt;/p&gt;
&lt;textarea name="code" class="ruby" cols="60"&gt;
ruby&gt; (Dog.new).speak   # or more commonly, Dog.new.speak
Bow Wow
&lt;/textarea&gt;

&lt;p&gt;
你可能會說: "等等，這可憐的傢伙在咆叫之後就會消失？" 是的，如果我們懶得給它名字， Ruby 的自動垃圾收集功能將判定這是一隻不再需要的流浪狗，並無情地處理掉。這是好事，如此我們才能無後顧之憂地建立我們需要的每一隻狗。
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3131360903311377656-6193249588120363034?l=rock-say-ruby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rock-say-ruby.blogspot.com/feeds/6193249588120363034/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3131360903311377656&amp;postID=6193249588120363034' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3131360903311377656/posts/default/6193249588120363034'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3131360903311377656/posts/default/6193249588120363034'/><link rel='alternate' type='text/html' href='http://rock-say-ruby.blogspot.com/2007/04/ruby-users-guideclasses.html' title='Ruby User&apos;s Guide::Classes'/><author><name>rock</name><uri>http://www.blogger.com/profile/04065431701479848049</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3131360903311377656.post-53773653582338202</id><published>2007-03-21T00:44:00.000-07:00</published><updated>2007-03-21T00:46:07.806-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby guide'/><title type='text'>Ruby User's Guide::Methods</title><content type='html'>&lt;h3&gt;方法&lt;/h3&gt;
English version: &lt;a href="http://www.rubyist.net/~slagell/ruby/methods.html"&gt;Methods&lt;/a&gt;

&lt;p&gt;
什麼是方法(method)? 在個體導向編程中，我們不希望外部直接操作個體內的資料；因為個體本身更了解這些資料應如何操作，故透過它提供的方式操作資料較為合適。這麼想吧，我們傳一些訊息給個體，這些訊息將引起個體做出某些動作或有意義的回應。我們只需知道傳什麼訊息可以讓個體做哪些工作，而不需關心個體內部的實際工作內容。那些允許我們要求個體完成或處理訊息的工作，就稱之為個體的方法或行為。「方法」或「行為」這兩種詞彙皆有使用。
&lt;/p&gt;
&lt;p&gt;
在 Ruby 中，我們以句號 (.) 調用個體的方法。個體為主詞置於句號左側，方法為動詞置於句號右側。 Ruby 是在程式運行途中，依變數當前所指涉之個體決定如何調用方法回應訊息。
&lt;/p&gt;
&lt;textarea name="code" class="ruby" rows="2" cols="60"&gt;
ruby&gt; "abcdef".length
   6
&lt;/textarea&gt;
&lt;p&gt;
直覺可知這是在問此字串個體之長度為何。技術上，我們調用 "abcdef" 之個體方法 &lt;code&gt;length&lt;/code&gt;。
&lt;/p&gt;
&lt;p&gt;
其他個體對「長度」的詮譯可能有些許差異，或者完全不同。
&lt;/p&gt;
&lt;textarea name="code" class="ruby" cols="60" rows="7"&gt;
ruby&gt; foo = "abc"
   "abc"
ruby&gt; foo.length
   3
ruby&gt; foo = ["abcde", "fghij"]
   ["abcde", "fghij"]
ruby&gt; foo.length
   2
&lt;/textarea&gt;

&lt;p&gt;
長度的意義根據我們所談及的對象不同而有所差異。我們第一次問 &lt;var&gt;foo&lt;/var&gt; 之長度時，它指涉一個字串，故長度的意義為此字串的字元數。第二次問長度時，&lt;var&gt;foo&lt;/var&gt;指涉一個陣列，在大多數情形下，此時長度的意義是指陣列的內容數量，故答案為 2 。
&lt;/p&gt;
&lt;p&gt;
根據實際指涉之個體以及傳遞之訊息決定工作方法的方式，接近我們使用自然語言時的表達習慣：同一詞語會依對象不同而具有不同的意義。此為個體導向編程的特徵，我們將之稱為「多型(polymorphism)」。
&lt;/p&gt;

&lt;p&gt;
當個體接收到一個它無法理解的訊息時，將喚起(raised)錯誤:
&lt;/p&gt;
&lt;textarea name="code" class="ruby" rows="4" cols="60"&gt;
ruby&gt; foo = 5
   5
ruby&gt; foo.length
ERR: (eval):1: undefined method `length' for 5(Fixnum)
&lt;/textarea&gt;

&lt;p&gt;
故我們需要知道個體接受哪些方法，雖然我們不須知道這些方法如何工作。
&lt;/p&gt;
&lt;p&gt;
若方法需要引數(arguments)時，引數通常用小括弧包起，但可以也省略。
&lt;/p&gt;

&lt;textarea name="code" class="ruby" rows="3" cols="60"&gt;
object.method(arg1, arg2)

object.method arg1, arg2
&lt;/textarea&gt;

&lt;p&gt;
Ruby 有一個特殊變數稱為 &lt;a href="http://zh.wikibooks.org/w/index.php?title=Ruby_Programming/Syntax/Variables_and_Constants&amp;variant=zh-tw#.E8.99.9B.E8.A8.AD.E8.AE.8A.E6.95.B8.28Pseudo_Variable.29"&gt;self&lt;/a&gt;，它指涉發生行為之個體。因為 我們經常使用 "self."，所以在個體本身內部使用時，我們可以省略它。
&lt;/p&gt;
&lt;textarea name="code" class="ruby" rows="3" cols="60"&gt;
self.method_name(args)
#is the same as
method_name(args)
&lt;/textarea&gt;
&lt;p&gt;
傳統上的函數呼叫(function call)在 Ruby 中亦被視為方法調用。那些函數性的方法仍然具有類似傳統程式語言的函數之行為特徵。在 Ruby 中談到「函數」時，通常表示那些並非真正的個體方法，而是純粹的演算法或抽象的敘述。
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3131360903311377656-53773653582338202?l=rock-say-ruby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rock-say-ruby.blogspot.com/feeds/53773653582338202/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3131360903311377656&amp;postID=53773653582338202' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3131360903311377656/posts/default/53773653582338202'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3131360903311377656/posts/default/53773653582338202'/><link rel='alternate' type='text/html' href='http://rock-say-ruby.blogspot.com/2007/03/ruby-users-guidemethods.html' title='Ruby User&apos;s Guide::Methods'/><author><name>rock</name><uri>http://www.blogger.com/profile/04065431701479848049</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3131360903311377656.post-5581019578636295647</id><published>2007-03-11T21:16:00.000-07:00</published><updated>2007-03-11T21:17:30.081-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby wikibook'/><title type='text'>Ruby Programming Wikibook::Symbol</title><content type='html'>&lt;h2&gt;&lt;span class="mw-headline"&gt;符號(Symbol)&lt;/span&gt;&lt;/h2&gt; &lt;p&gt;將冒號(:)加在識別字前，即為&lt;b&gt;符號&lt;/b&gt;。符號是一種識別用的記號，經常於&lt;a href="http://zh.wikibooks.org/w/index.php?title=Ruby_Programming/Syntax/Literals&amp;variant=zh-tw#.E9.9B.9C.E6.B9.8A.E8.A1.A8.28Hash.29" title=""&gt;雜湊表&lt;/a&gt;中作為鍵值。可用&lt;a href="http://zh.wikibooks.org/w/index.php?title=Ruby_Programming/Syntax/Literals&amp;amp;variant=zh-tw#.25.E8.A8.98.E8.99.9F.E4.BF.AE.E9.A3.BE.E5.AD.97.E5.85.83.E8.88.87.E6.95.88.E6.9E.9C.E8.A1.A8" title=""&gt;%s&lt;/a&gt;指定冒號之替用符號。&lt;/p&gt; &lt;p&gt;範例:&lt;/p&gt; &lt;pre&gt;:abc    # just mark here as 'abc'
t1 = {:name =&gt; 'john', :age =&gt; 20}
puts t1[:name]
t2 = {%s'name' =&gt; 'smith', %s[age] =&gt; 16}
puts t2[:name]
&lt;/pre&gt; &lt;p&gt;一般而言，以符號作為雜湊表之鍵值時效能較佳。因為以字串為鍵值時，Ruby 必須計算字串的雜湊值；以符號為鍵值時則不需計算。熟悉 C/C++ 語言的程式員可以 enum 與 map 之差異比對：以符號為鍵值類似以 enum 建立表；以字串為鍵值類似以 map class 建立表。兩者效能差異顯著。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3131360903311377656-5581019578636295647?l=rock-say-ruby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rock-say-ruby.blogspot.com/feeds/5581019578636295647/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3131360903311377656&amp;postID=5581019578636295647' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3131360903311377656/posts/default/5581019578636295647'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3131360903311377656/posts/default/5581019578636295647'/><link rel='alternate' type='text/html' href='http://rock-say-ruby.blogspot.com/2007/03/ruby-programming-wikibooksymbol.html' title='Ruby Programming Wikibook::Symbol'/><author><name>rock</name><uri>http://www.blogger.com/profile/04065431701479848049</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3131360903311377656.post-6710984058175572938</id><published>2007-03-11T21:09:00.000-07:00</published><updated>2007-03-11T21:14:26.113-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby wikibook'/><title type='text'>Ruby Programming Wikibook::Variables and Constants</title><content type='html'>&lt;p&gt; 在 Ruby 中，我們可以&lt;a href="http://zh.wikibooks.org/w/index.php?title=Ruby_Programming/Syntax/Lexicology&amp;variant=zh-tw#.E8.AD.98.E5.88.A5.E5.AD.97.28Identifiers.29" title="Ruby Programming/Syntax/Lexicology"&gt;識別字&lt;/a&gt;為一個變數命名，名稱沒有長度限制。一個尚未初始之變數，其值為&lt;a href="http://zh.wikibooks.org/w/index.php?title=Ruby_Programming/Syntax/Variables_and_Constants&amp;amp;variant=zh-tw#.E8.99.9B.E8.A8.AD.E8.AE.8A.E6.95.B8.28Pseudo_Variable.29" title=""&gt;nil&lt;/a&gt;。
&lt;/p&gt;&lt;h2&gt;&lt;span class="mw-headline"&gt;區域變數(Local Variable)&lt;/span&gt;&lt;/h2&gt; &lt;p&gt;範例:&lt;/p&gt; &lt;pre&gt;foobar
&lt;/pre&gt; &lt;p&gt;一個變數之名稱若以小寫英文字母 (a-z) 或底線字元 (_) 為首，則該變數即為域變數或方法之參數。區域變數只能在它初始化之區塊內存取。例如:&lt;/p&gt; &lt;pre&gt;i0 = 1
loop {
i1 = 2
print defined?(i0), "\n"      # true; 已定義，"i0" 於上層區塊中初始化。
print defined?(i1), "\n"      # true; 已定義，"i1" 於此區塊中初始化。
break
}
print defined?(i0), "\n"        # true; 已定義，"i0 於此區塊中初始化。
print defined?(i1), "\n"        # false; 未定義，"i1" 於 loop 區塊中初始化。
&lt;/pre&gt; &lt;p&gt;&lt;a name=".E5.AF.A6.E4.BE.8B.E8.AE.8A.E6.95.B8.28Instance_Variable.29"&gt;&lt;/a&gt;&lt;/p&gt; &lt;h2&gt;&lt;span class="editsection"&gt;&lt;/span&gt;&lt;span class="mw-headline"&gt;實例變數(Instance Variable)&lt;/span&gt;&lt;/h2&gt; &lt;p&gt;範例:&lt;/p&gt; &lt;pre&gt;@foobar
&lt;/pre&gt; &lt;p&gt;一個變數之名稱若以 '&lt;span style="font-family:courier new;"&gt;@&lt;/span&gt;' 為首，即為&lt;a href="http://zh.wikibooks.org/w/index.php?title=Ruby_Programming/Syntax/Classes&amp;variant=zh-tw" title="Ruby Programming/Syntax/Classes"&gt;實例&lt;/a&gt;本身的實例變數。實例變數屬於實例之一部份，其意義等於 C++/Java 語言中之&lt;b&gt;私有資料成員(private data member)&lt;/b&gt;。事實上，Ruby 嚴格遵守一個變數只能在其初始化區塊中存取之定義，因此區塊以外之敘述不允許存取實例內之變數。若外部想存取實例變數，只能透過實例的&lt;a href="http://zh.wikibooks.org/w/index.php?title=Ruby_Programming/Syntax/Method_Calls&amp;amp;variant=zh-tw" title="Ruby Programming/Syntax/Method Calls"&gt;方法&lt;/a&gt;。&lt;/p&gt; &lt;p&gt;&lt;a name=".E9.A1.9E.E5.88.A5.E8.AE.8A.E6.95.B8.28Class_Variable.29"&gt;&lt;/a&gt;&lt;/p&gt; &lt;h2&gt;&lt;span class="editsection"&gt;&lt;/span&gt;&lt;span class="mw-headline"&gt;類別變數(Class Variable)&lt;/span&gt;&lt;/h2&gt; &lt;p&gt;範例:&lt;/p&gt; &lt;pre&gt;@@foobar
&lt;/pre&gt; &lt;p&gt;&lt;a href="http://zh.wikibooks.org/w/index.php?title=Ruby_Programming/Syntax/Classes&amp;variant=zh-tw" title="Ruby Programming/Syntax/Classes"&gt;類&lt;/a&gt;在 Ruby 中也是一個實在的個體，因此類本身也有內部的變數。其意義等於C++/Java語言中之類別私有靜態成員(private static class member)。&lt;/p&gt; &lt;p&gt;&lt;a name=".E5.85.A8.E5.9F.9F.E8.AE.8A.E6.95.B8.28Global_Variable.29"&gt;&lt;/a&gt;&lt;/p&gt; &lt;h2&gt;&lt;span class="editsection"&gt;&lt;/span&gt;&lt;span class="mw-headline"&gt;全域變數(Global Variable)&lt;/span&gt;&lt;/h2&gt; &lt;p&gt;一個變數之名稱若以 '&lt;span style="font-family:courier new;"&gt;$&lt;/span&gt;' 為首，即屬全域變數；當程式運作時，可在任何地方存取它。 範例:&lt;/p&gt; &lt;pre&gt;$foobar
&lt;/pre&gt; &lt;p&gt;&lt;a name=".E5.B8.B8.E6.95.B8.28Constant.29"&gt;&lt;/a&gt;&lt;/p&gt; &lt;h2&gt;&lt;span class="editsection"&gt;&lt;/span&gt;&lt;span class="mw-headline"&gt;常數(Constant)&lt;/span&gt;&lt;/h2&gt; &lt;p&gt;範例:&lt;/p&gt; &lt;pre&gt;FOOBAR
&lt;/pre&gt; &lt;p&gt;一個變數之名稱若以大寫英文字母 (A-Z) 為首，即為常數。Ruby 允許在初始化常數後又再次指派其他值，但會發出警告訊息。Ruby 的每個&lt;a href="http://zh.wikibooks.org/w/index.php?title=Ruby_Programming/Syntax/Classes&amp;amp;variant=zh-tw" title="Ruby Programming/Syntax/Classes"&gt;類&lt;/a&gt;都是一個常數。&lt;/p&gt; &lt;p&gt;若試圖取得一個未初始常數之值，將會喚起一個&lt;code&gt;NameError&lt;/code&gt;異常。&lt;/p&gt; &lt;p&gt;&lt;a name=".E8.99.9B.E8.A8.AD.E8.AE.8A.E6.95.B8.28Pseudo_Variable.29"&gt;&lt;/a&gt;&lt;/p&gt; &lt;h2&gt;&lt;span class="editsection"&gt;&lt;/span&gt;&lt;span class="mw-headline"&gt;虛設變數(Pseudo Variable)&lt;/span&gt;&lt;/h2&gt; &lt;p&gt;虛設變數具有變數的性質，但其意義固定，由 Ruby 按其意義決定虛設變數指涉的內容。若改變虛設變數之意義，將令 Ruby 發出異常。&lt;/p&gt; &lt;p&gt;&lt;code&gt;&lt;b&gt;self&lt;/b&gt;&lt;/code&gt;&lt;/p&gt; &lt;dl&gt;&lt;dd&gt;指涉行為個體本身。和 C/C++ 語言之 &lt;code&gt;this&lt;/code&gt; 關鍵字意義相同。&lt;/dd&gt;&lt;/dl&gt; &lt;p&gt;&lt;code&gt;&lt;b&gt;nil&lt;/b&gt;&lt;/code&gt;&lt;/p&gt; &lt;dl&gt;&lt;dd&gt;表示「無此物」，這是 &lt;code&gt;&lt;a href="http://zh.wikibooks.org/w/index.php?title=Ruby_Programming/Object/NilClass&amp;action=edit" class="new" title="Ruby Programming/Object/NilClass"&gt;NilClass&lt;/a&gt;&lt;/code&gt; 類別的唯一實例。&lt;/dd&gt;&lt;/dl&gt; &lt;p&gt;&lt;code&gt;&lt;b&gt;true&lt;/b&gt;&lt;/code&gt;&lt;/p&gt; &lt;dl&gt;&lt;dd&gt;「真」或「真值」，為 &lt;code&gt;&lt;a href="http://zh.wikibooks.org/w/index.php?title=Ruby_Programming/Object/TrueClass&amp;amp;action=edit" class="new" title="Ruby Programming/Object/TrueClass"&gt;TrueClass&lt;/a&gt;&lt;/code&gt; 類別之唯一實例。&lt;/dd&gt;&lt;/dl&gt; &lt;p&gt;&lt;code&gt;&lt;b&gt;false&lt;/b&gt;&lt;/code&gt;&lt;/p&gt; &lt;dl&gt;&lt;dd&gt;「偽」或「偽值」，為 &lt;code&gt;&lt;a href="http://zh.wikibooks.org/w/index.php?title=Ruby_Programming/Object/FalseClass&amp;amp;action=edit" class="new" title="Ruby Programming/Object/FalseClass"&gt;FalseClass&lt;/a&gt;&lt;/code&gt; 類別的唯一實例。 (在 Ruby 中，&lt;b&gt;nil&lt;/b&gt; 也視同 &lt;b&gt;false&lt;/b&gt;，除此以外任何值都視同 &lt;b&gt;true&lt;/b&gt;。)&lt;/dd&gt;&lt;/dl&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3131360903311377656-6710984058175572938?l=rock-say-ruby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rock-say-ruby.blogspot.com/feeds/6710984058175572938/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3131360903311377656&amp;postID=6710984058175572938' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3131360903311377656/posts/default/6710984058175572938'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3131360903311377656/posts/default/6710984058175572938'/><link rel='alternate' type='text/html' href='http://rock-say-ruby.blogspot.com/2007/03/ruby-programming-wikibookvariables-and.html' title='Ruby Programming Wikibook::Variables and Constants'/><author><name>rock</name><uri>http://www.blogger.com/profile/04065431701479848049</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3131360903311377656.post-3305293519505236691</id><published>2007-03-08T17:32:00.000-08:00</published><updated>2007-03-09T08:20:49.567-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby wikibook'/><title type='text'>Ruby Programming Wikibook::Alternate Notation</title><content type='html'>&lt;h3&gt;&lt;span class="mw-headline"&gt;Alternate Notation&lt;/span&gt;&lt;/h3&gt; &lt;p&gt;'&lt;b&gt;%'記號&lt;/b&gt;&lt;/p&gt; &lt;p&gt;Ruby 正式語法使用單引號與雙引號作為字串的括號。但 Ruby 從 Perl 語言中得到一個關於字串括號的古怪靈感：用 % (百分比字元) 指定字串的括號符號。例如: %[], %(), %{} 。除成對括弧符號外也可用單獨字元，如 %!!, %@@ 。在一個 % 字元後得指定一個修飾字元，諸如: %q[], %Q[], %x ，它們決定是否套用&lt;a href="http://zh.wikibooks.org/w/index.php?title=Ruby_Programming/Syntax/Literals&amp;variant=zh-tw#.E5.8F.8D.E6.96.9C.E7.B7.9A.E8.A8.98.E8.99.9F.28Backslash_Notation.29" title=""&gt;反斜線記號&lt;/a&gt;與&lt;a href="http://zh.wikibooks.org/w/index.php?title=Ruby_Programming/Syntax/Literals&amp;amp;variant=zh-tw#.E7.AB.84.E5.AF.AB.28Interpolation.29" title=""&gt;竄寫&lt;/a&gt;規則。詳見&lt;a href="http://zh.wikibooks.org/w/index.php?title=Ruby_Programming/Syntax/Literals&amp;variant=zh-tw#.E5.96.AE.E5.BC.95.E8.99.9F.E7.9A.84.E6.9B.BF.E7.94.A8.E8.80.85" title=""&gt;單引號的替用者&lt;/a&gt;與&lt;a href="http://zh.wikibooks.org/w/index.php?title=Ruby_Programming/Syntax/Literals&amp;amp;variant=zh-tw#.E9.9B.99.E5.BC.95.E8.99.9F.E7.9A.84.E6.9B.BF.E7.94.A8.E8.80.85" title=""&gt;雙引號的替用者&lt;/a&gt;。&lt;/p&gt; &lt;p&gt;範例:&lt;/p&gt; &lt;pre&gt; '不套用竄寫與反斜線記號規則'
"套用竄寫 #{interpolation}, 與反斜線記號 - \n"
%q(不套用竄寫)
%Q(套用竄寫 #{interpolation} 與反斜線記號 - \n)
%(竄寫與反斜線)
`echo "指令竄寫與反斜線"`
%x(echo "指令竄寫與反斜線")
&lt;/pre&gt; &lt;p&gt;上述所有例子都有建置一個字串變數之效果。&lt;/p&gt; &lt;p&gt;當我們需要建置一個含有括號字串的字串卻又不想使用反斜線記號為括號字串轉義時，便經常運用'%'記號自行指定字串括號之符號。以自行指定的符號作為括號的替用者。&lt;/p&gt; &lt;pre&gt; "string \"with\" quotes"    #字串中含有雙引號(")，必須以反斜線記號轉義
%{string "with" quotes}     #以'%'記號指定大括弧{}為替用括號。
%!another string example!         &lt;span style="color: rgb(0, 119, 0);"&gt;=&gt; "another string example"&lt;/span&gt;
%@another "obnoxious" example@    &lt;span style="color: rgb(0, 119, 0);"&gt;=&gt; "another \"obnoxious\" example"&lt;/span&gt; &lt;/pre&gt; &lt;p&gt;'%r' 可指定&lt;a href="http://zh.wikibooks.org/w/index.php?title=Ruby_Programming/Syntax/Literals&amp;variant=zh-tw#.E5.AD.97.E6.A8.A3.E8.A6.8F.E5.89.87.E5.BC.8F.28Regular_Expression.29" title=""&gt;字樣規則式&lt;/a&gt;之邊界符號(/ 字元)的替用者。例如下列二式同義:&lt;/p&gt; &lt;pre&gt; response.gsub! /&lt;.*?&gt;/, ""    # 移除所有標籤
response.gsub! %r{&lt;.*?&gt;}, ""  # 以 %r 指定大括弧為 / 符號的替用者。
&lt;/pre&gt; &lt;p&gt;'%w' 可指定&lt;a href="http://zh.wikibooks.org/w/index.php?title=Ruby_Programming/Syntax/Literals&amp;amp;variant=zh-tw#.E9.99.A3.E5.88.97.28Array.29" title=""&gt;陣列&lt;/a&gt;之邊界符號([ ])的替用者。還有一個附帶效果：將其中所有字面值都視為字串；單、雙引號將被視為字串的一部份而非字串的括號。&lt;/p&gt; &lt;p&gt;範例:&lt;/p&gt; &lt;pre&gt;ar = ['123', 'abc', 'xyz']
=&gt; ["123", "abc", "xyz"]
ar = %w&lt;&gt;
=&gt; ["123", "abc", "xyz"]
ar = %w! 123, abc, xyz !
=&gt; ["123", "abc", "xyz"]

ar = ['I\'s']
=&gt; ["I's"]
ar = %w[ I's ]
=&gt; ["I's"]
&lt;/pre&gt; &lt;p&gt;&lt;a name=".25.E8.A8.98.E8.99.9F.E4.BF.AE.E9.A3.BE.E5.AD.97.E5.85.83.E8.88.87.E6.95.88.E6.9E.9C.E8.A1.A8"&gt;&lt;/a&gt;&lt;/p&gt; &lt;h4&gt;&lt;span class="editsection"&gt;&lt;/span&gt;&lt;span class="mw-headline"&gt;%記號修飾字元與效果表&lt;/span&gt;&lt;/h4&gt; &lt;table border="1" cellpadding="2" cellspacing="2"&gt; &lt;tbody&gt;&lt;tr&gt; &lt;td&gt;%&lt;/td&gt; &lt;td&gt;指定字串括號的替用符號，並套用&lt;a href="http://zh.wikibooks.org/w/index.php?title=Ruby_Programming/Syntax/Literals&amp;variant=zh-tw#.E9.9B.99.E5.BC.95.E8.99.9F.E6.8B.AC.E8.99.9F" title=""&gt;雙引號括號&lt;/a&gt;規則。詳見&lt;a href="http://zh.wikibooks.org/w/index.php?title=Ruby_Programming/Syntax/Literals&amp;amp;variant=zh-tw#.E9.9B.99.E5.BC.95.E8.99.9F.E7.9A.84.E6.9B.BF.E7.94.A8.E8.80.85" title=""&gt;雙引號的替用者&lt;/a&gt;。&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;%q&lt;/td&gt; &lt;td&gt;指定字串括號的替用符號，並套用&lt;a href="http://zh.wikibooks.org/w/index.php?title=Ruby_Programming/Syntax/Literals&amp;variant=zh-tw#.E5.96.AE.E5.BC.95.E8.99.9F.E6.8B.AC.E8.99.9F" title=""&gt;單引號括號&lt;/a&gt;規則。詳見&lt;a href="http://zh.wikibooks.org/w/index.php?title=Ruby_Programming/Syntax/Literals&amp;amp;variant=zh-tw#.E5.96.AE.E5.BC.95.E8.99.9F.E7.9A.84.E6.9B.BF.E7.94.A8.E8.80.85" title=""&gt;單引號的替用者&lt;/a&gt;。&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;%Q&lt;/td&gt; &lt;td&gt;指定字串括號的替用符號，並套用&lt;a href="http://zh.wikibooks.org/w/index.php?title=Ruby_Programming/Syntax/Literals&amp;variant=zh-tw#.E9.9B.99.E5.BC.95.E8.99.9F.E6.8B.AC.E8.99.9F" title=""&gt;雙引號括號&lt;/a&gt;規則。詳見&lt;a href="http://zh.wikibooks.org/w/index.php?title=Ruby_Programming/Syntax/Literals&amp;amp;variant=zh-tw#.E9.9B.99.E5.BC.95.E8.99.9F.E7.9A.84.E6.9B.BF.E7.94.A8.E8.80.85" title=""&gt;雙引號的替用者&lt;/a&gt;。&lt;a href="http://zh.wikibooks.org/w/index.php?title=Ruby_Programming/Syntax/Literals&amp;variant=zh-tw#.E9.9B.99.E5.BC.95.E8.99.9F.E7.9A.84.E6.9B.BF.E7.94.A8.E8.80.85" title=""&gt;&lt;/a&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;%r&lt;/td&gt; &lt;td&gt;指定&lt;a href="http://zh.wikibooks.org/w/index.php?title=Ruby_Programming/Syntax/Literals&amp;amp;variant=zh-tw#.E5.AD.97.E6.A8.A3.E8.A6.8F.E5.89.87.E5.BC.8F.28Regular_Expression.29" title=""&gt;字樣規則式&lt;/a&gt;之邊界符號(/ 字元)的替用符號。&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt;&lt;td style="vertical-align: top;"&gt;%s
&lt;/td&gt;&lt;td style="vertical-align: top;"&gt;指定&lt;a href="http://zh.wikibooks.org/w/index.php?title=Ruby_Programming/Syntax/Literals&amp;variant=zh-tw#.E7.AC.A6.E8.99.9F.28Symbol.29"&gt;&lt;span style="text-decoration: underline;"&gt;符號&lt;/span&gt;&lt;/a&gt;之邊界符號(:)的替用符號。
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt; &lt;td&gt;%w&lt;/td&gt; &lt;td&gt;指定&lt;a href="http://zh.wikibooks.org/w/index.php?title=Ruby_Programming/Syntax/Literals&amp;variant=zh-tw#.E9.99.A3.E5.88.97.28Array.29" title=""&gt;陣列&lt;/a&gt;之邊界符號([ ])的替用符號。&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt;&lt;td style="vertical-align: top;"&gt;%W
&lt;/td&gt;&lt;td style="vertical-align: top;"&gt;指定&lt;a href="http://zh.wikibooks.org/w/index.php?title=Ruby_Programming/Syntax/Literals&amp;variant=zh-tw#.E9.99.A3.E5.88.97.28Array.29" title=""&gt;陣列&lt;/a&gt;之邊界符號([ ])的替用符號，並套用&lt;a href="http://zh.wikibooks.org/w/index.php?title=Ruby_Programming/Syntax/Literals&amp;amp;variant=zh-tw#.E9.9B.99.E5.BC.95.E8.99.9F.E6.8B.AC.E8.99.9F" title=""&gt;雙引號括號&lt;/a&gt;規則。&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="vertical-align: top;"&gt;%x
&lt;/td&gt;&lt;td style="vertical-align: top;"&gt;指定&lt;a href="http://zh.wikibooks.org/w/index.php?title=Ruby_Programming/Syntax/Literals&amp;amp;variant=zh-tw#.E6.8C.87.E4.BB.A4.E7.AB.84.E5.AF.AB.28Command_Interpolation.29" title=""&gt;指令竄寫&lt;/a&gt;之邊界符號(`)的替用符號。&lt;/td&gt;&lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt; &lt;p&gt;&lt;a name=".E5.96.AE.E5.BC.95.E8.99.9F.E7.9A.84.E6.9B.BF.E7.94.A8.E8.80.85"&gt;&lt;/a&gt;&lt;/p&gt; &lt;h3&gt;&lt;span class="editsection"&gt;&lt;/span&gt;&lt;span class="mw-headline"&gt;
&lt;/span&gt;&lt;/h3&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3131360903311377656-3305293519505236691?l=rock-say-ruby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rock-say-ruby.blogspot.com/feeds/3305293519505236691/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3131360903311377656&amp;postID=3305293519505236691' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3131360903311377656/posts/default/3305293519505236691'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3131360903311377656/posts/default/3305293519505236691'/><link rel='alternate' type='text/html' href='http://rock-say-ruby.blogspot.com/2007/03/ruby-programming-wikibookalternate.html' title='Ruby Programming Wikibook::Alternate Notation'/><author><name>rock</name><uri>http://www.blogger.com/profile/04065431701479848049</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3131360903311377656.post-3308763602860189247</id><published>2007-03-03T11:03:00.000-08:00</published><updated>2007-03-03T11:20:43.538-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby guide'/><title type='text'>Ruby User's Guide::Iterators</title><content type='html'>&lt;h3&gt;迭代&lt;/h3&gt;
English version: &lt;a href="http://www.rubyist.net/~slagell/ruby/iterators.html"&gt;Iterators&lt;/a&gt;

&lt;p&gt;
迭代(iterator)並非 Ruby 原創的概念，這是普遍存在於個體導向語言中的概念。 Lisp 也有，儘管 Lisp 不以迭代稱呼。然而在這些語言中，迭代並非可以一概之的相似性概念，所以它仍需要仔細說明。
&lt;/p&gt;
&lt;p&gt;英文動詞 &lt;em&gt;iterate&lt;/em&gt; 意為做相同的事多次 (中文直接用「反覆」) ，所以 &lt;em&gt;迭代(iterator)&lt;/em&gt; 指一種會反覆做相同工作的事物。&lt;/p&gt;

&lt;p&gt;撰寫程式碼時，常有各式各樣的情形需要循環處理。在 C 語言中，我們用 &lt;code&gt;for&lt;/code&gt; 或 &lt;code&gt;while&lt;/code&gt;。例如:&lt;/p&gt;
&lt;textarea name="code" class="ruby"&gt;
for (str = "abcdefg"; *str != '\0'; str++) {
    /* 處理動作 */
}
&lt;/textarea&gt;

&lt;p&gt;C 語言的 &lt;code&gt; for(...) &lt;/code&gt; 語法幫助我們建立抽象的迴圈動作，但仍要求程序員了解字串內部結構的細節，才能寫出測試 &lt;code&gt;*str&lt;/code&gt; 是否為 null 字元的程式碼。這使得 C 語言感覺像是低階語言。高階語言應提供更有彈性的迭代。看看下列的 &lt;code&gt;sh&lt;/code&gt; 指令手稿的做法:&lt;/p&gt;
&lt;textarea name="code" class="ruby"&gt;
#!/bin/sh
for i in *.[ch]; do
    # ... 針對每一個檔案做某件事
done
&lt;/textarea&gt;

&lt;p&gt;
目前目錄下所有 C 語言源碼及標頭檔案都會被處理，由命令外層負責一一取得檔案名稱。這種作法看來比 C 語言高階多了，不是嗎？&lt;/p&gt;
&lt;p&gt;但還有需要考量之事: 程式語言能否為我們自定的資料型態提供如同內建資料型態一般的迭代方式？個體導向編程 (OOP) 時，我們時常定義一個又一個的資料型態，所以須認真對待這問題。&lt;/p&gt;
&lt;p&gt;為達上述目的，每種個體導向程式語言各有一些方便進行迭代的能力。有些語言為此目的提供了特殊的類別； Ruby 則允許我們直接定義迭代內容。&lt;/p&gt;
&lt;p&gt;Ruby 的 &lt;code&gt;String&lt;/code&gt;(字串) 型態有些實用的迭代:&lt;/p&gt;
&lt;textarea name="code" class="ruby"&gt;
irb&gt; "xyz".each_byte{ |c|
irb*    printf "&lt;%c&gt;", c
irb&gt; }; puts "\n"
&lt;x&gt;&lt;y&gt;&lt;z&gt;
=&gt; nil
&lt;/textarea&gt;

&lt;p&gt;&lt;code&gt;each_byte&lt;/code&gt; 是處理字串中每一個字元的迭代。每個字元都會被代入區域變數 &lt;code&gt;c&lt;/code&gt; 。若以類似 C 語言的程式碼來表達，可改寫成...&lt;/p&gt;
&lt;textarea name="code" class="ruby"&gt;
irb&gt; s = "xyz"; i = 0
=&gt; 0
irb&gt; while i &lt; s.length
irb&gt;    printf "&lt;%c&gt;", s[i]
irb&gt;    i+=1
irb&gt; end; puts "\n"
&lt;x&gt;&lt;y&gt;&lt;z&gt;
=&gt; nil
&lt;/textarea&gt;

&lt;p&gt;... 然而， &lt;code&gt;each_byte&lt;/code&gt; 迭代之概念較簡單，即使未來大幅改變 &lt;code&gt;String&lt;/code&gt; 類別的結構，似乎仍可繼續運作。迭代的其中一項好處在其有助於對此類變化設計耐用的程式碼；一般而言確實是良好的程式編寫特性。&lt;/p&gt;
&lt;p&gt;另一個有用的 &lt;code&gt;String&lt;/code&gt; 迭代是 &lt;code&gt;each_line&lt;/code&gt;。&lt;/p&gt;
&lt;textarea name="code" class="ruby"&gt;
irb&gt; "a\nb\nc\n".each_line{ |l|
irb*    print l
irb&gt; }
a
b
c
=&gt; "a\nb\nc\n"
&lt;/textarea&gt;

&lt;p&gt;用迭代比在 C 語言中做同樣的事要容易得多。&lt;/p&gt;

&lt;p&gt;
在前一章說明的 &lt;code&gt;for&lt;/code&gt; 敘述就是使用 &lt;code&gt;each&lt;/code&gt; 迭代完成迭代工作。 &lt;code&gt;String&lt;/code&gt; 的 &lt;code&gt;each&lt;/code&gt; 與 &lt;code&gt;each_line&lt;/code&gt; 的效果相同，所以上述範例可以 &lt;code&gt;for&lt;/code&gt; 改寫為:&lt;/p&gt;
&lt;textarea name="code" class="ruby"&gt;
irb&gt; for l in "a\nb\nc\n"
irb&gt;    print l
irb&gt; end
a
b
c
=&gt; "a\nb\nc\n"
&lt;/textarea&gt;

&lt;p&gt;我們可以在迴圈中結合 &lt;code&gt;retry&lt;/code&gt; 敘述令迴圈重新開始工作。&lt;/p&gt;

&lt;textarea name="code" class="ruby"&gt;
irb&gt; c = 0
=&gt; 0
irb&gt; for i in 0..4
irb&gt;    print i
irb&gt;    if i == 2 and c == 0
irb&gt;        c = 1
irb&gt;        print "\n"
irb&gt;        retry
irb&gt;    end
irb&gt; end; print "\n"
012
01234
=&gt; nil
&lt;/textarea&gt;

&lt;p&gt;將上述範例中的 &lt;code&gt;retry&lt;/code&gt; 換成 &lt;code&gt;redo&lt;/code&gt; ，只會令迴圈再做一次現行迭代項目，其輸出內容為:&lt;/p&gt;
&lt;textarea name="code" class="ruby"&gt;
012
234
&lt;/textarea&gt;

&lt;p&gt;&lt;code&gt;yield&lt;/code&gt; 有時用於定義一個迭代內容。 &lt;code&gt;yield&lt;/code&gt; 可將程式流程轉移至傳遞給迭代的程式碼區塊 (這在 &lt;a href="procobjects.html"&gt;程序個體&lt;/a&gt; 一章中會仔細說明)。下列範例定義了名為 &lt;code&gt;repeat&lt;/code&gt; 的迭代，它會依據引數所指定之次數，重複執行程式碼區塊內容。&lt;/p&gt;
&lt;textarea name="code" class="ruby"&gt;
irb&gt; def repeat(num)
irb&gt;    while num &gt; 0
irb&gt;        yield
irb&gt;        num -= 1
irb&gt;    end
irb&gt; end
=&gt; nil
irb&gt; repeat(3) { puts "foo" }
foo
foo
foo
=&gt; nil
&lt;/textarea&gt;

&lt;p&gt;利用 &lt;code&gt;retry&lt;/code&gt; ，我們可定義一個類似 Ruby 標準 &lt;code&gt;while&lt;/code&gt; 效果的迭代。&lt;/p&gt;
&lt;textarea name="code" class="ruby"&gt;
irb&gt; def WHILE(cond)
irb&gt;    return if not cond
irb&gt;    yield
irb&gt;    retry
irb&gt; end
=&gt; nil
irb&gt; i = 0; WHILE(i &lt; 3) { print i; i+=1 }
012=&gt; nil
&lt;/textarea&gt;

&lt;p&gt;
你現在是否了解什麼是迭代了呢？儘管有些限制，但你已經可撰寫自創的迭代；事實上，每當定義一個新的資料型態時，通常會一併定義合適的迭代作為搭配。以此而言，則上述範例並無用處。先在此打住，當我們更了解什麼是類別時，我們再談如何設計實用性的迭代。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3131360903311377656-3308763602860189247?l=rock-say-ruby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rock-say-ruby.blogspot.com/feeds/3308763602860189247/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3131360903311377656&amp;postID=3308763602860189247' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3131360903311377656/posts/default/3308763602860189247'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3131360903311377656/posts/default/3308763602860189247'/><link rel='alternate' type='text/html' href='http://rock-say-ruby.blogspot.com/2007/03/ruby-users-guideiterators.html' title='Ruby User&apos;s Guide::Iterators'/><author><name>rock</name><uri>http://www.blogger.com/profile/04065431701479848049</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3131360903311377656.post-5816047317140474857</id><published>2007-02-28T06:12:00.000-08:00</published><updated>2007-03-03T11:15:37.725-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby guide'/><title type='text'>Ruby User's Guide::Control structures</title><content type='html'>&lt;h3&gt;流程控制&lt;/h3&gt;
English version: &lt;a href="http://www.rubyist.net/~slagell/ruby/control.html"&gt;Control structures&lt;/a&gt;

&lt;p&gt;本章說明關於 Ruby 的流程控制敘述。&lt;/p&gt;

&lt;h3&gt;&lt;code&gt;case&lt;/code&gt;&lt;/h3&gt;
&lt;!-- RDLabel: "case" --&gt;
&lt;p&gt;我們使用 &lt;code&gt;case&lt;/code&gt; 敘述測試一連串的條件。其作用類似 C 和 Java 之中的 &lt;code&gt;switch&lt;/code&gt; ，但使用方式更強大。&lt;/p&gt;

&lt;textarea name="code" class="ruby"&gt;
irb&gt; i=8
=&gt; 8
irb&gt; case i
irb&gt; when 1, 2..5
irb&gt;     puts "1..5"
irb&gt; when 6..10
irb&gt;     puts "6..10"
irb&gt; end
6..10
=&gt; nil
&lt;/textarea&gt;

&lt;p&gt;&lt;code&gt;2..5&lt;/code&gt; 是表示 &lt;em&gt;範圍(range)&lt;/em&gt; 的式子，此例指示在 2 到 5 以內的範圍。如下列算式便可測試 &lt;code&gt;i&lt;/code&gt; 的值是否處於 2 到 5 以內之範圍:&lt;/p&gt;

&lt;textarea name="code" class="ruby:nogutter"&gt;
(2..5) === i
&lt;/textarea&gt;

&lt;p&gt;
&lt;code&gt;case&lt;/code&gt; 內部使用運算子 &lt;code&gt;===&lt;/code&gt; 一次測試多個條件式。基於 Ruby 的個體導向本性，出現在 &lt;code&gt;when&lt;/code&gt; 條件中的個體會套用 &lt;code&gt;===&lt;/code&gt; 運算，作用如同 &lt;code&gt;(6..10) === i&lt;/code&gt;。
&lt;/p&gt;
&lt;p&gt;
在下面的例子中，將會測試字串是否等於第一個 &lt;code&gt;when&lt;/code&gt; 中的字串，接著測試是否符合第二個 &lt;code&gt;when&lt;/code&gt; 的字樣規則式。&lt;/p&gt;

&lt;textarea name="code" class="ruby"&gt;
irb&gt; case 'abcdef'
irb&gt; when 'aaa', 'bbb'
irb&gt;     puts "aaa or bbb"
irb&gt; when /def/
irb&gt;     puts "includes /def/"
irb&gt; end
includes /def/
=&gt; nil
&lt;/textarea&gt;

&lt;h3&gt;&lt;code&gt;while&lt;/code&gt;&lt;/h3&gt;
&lt;!-- RDLabel: "while" --&gt;

&lt;p&gt;
Ruby 提供了常見的迴圈結構。然而你將在下一章中學會如何使用 &lt;em&gt;迭代(iterator)&lt;/em&gt; ，它讓你不需要時常撰寫迴圈程式碼。&lt;/p&gt;

&lt;p&gt;一個 &lt;code&gt;while&lt;/code&gt; 敘述就是一個重複的 &lt;code&gt;if&lt;/code&gt; 敘述。我們在前面幾章的猜謎程式及字樣規則程式中曾使用它；它的句型為 &lt;code&gt;while &lt;em&gt;condition&lt;/em&gt; ... end&lt;/code&gt; ，其中包含當 &lt;em&gt;condition&lt;/em&gt; 為真時就重複執行的程式碼區塊。但 &lt;code&gt;while&lt;/code&gt; 和 &lt;code&gt;if&lt;/code&gt; 也可以簡單地用於單獨的敘述:&lt;/p&gt;

&lt;textarea name="code" class="ruby"&gt;
irb&gt; i = 0
=&gt; 0
puts "It's zero." if i == 0
It's zero.
=&gt; nil
irb&gt; puts "It's negative." if i &lt; 0
=&gt; nil
irb&gt; puts i+=1 while i &lt; 3
3
=&gt; nil
&lt;/textarea&gt;


&lt;p&gt;
有時候你需要否定一個測試條件。&lt;code&gt;unless&lt;/code&gt; 就是 &lt;code&gt;if&lt;/code&gt; 的否定型，而 &lt;code&gt;until&lt;/code&gt; 就是 &lt;code&gt;while&lt;/code&gt; 的否定型。你可以自己試試看。&lt;/p&gt;

&lt;p&gt;有四種在迴圈內部中斷迴圈進行的方式。第一種、&lt;code&gt;break&lt;/code&gt;，它的意義是脫離迴圈。第二種、&lt;code&gt;next&lt;/code&gt; ，它的意義是跳到迴圈起始處繼續下一個迭代工作項目 (如同 C 的 &lt;code&gt;continue&lt;/code&gt;)。第三種、&lt;code&gt;redo&lt;/code&gt; ，它將重新開始現行的迭代工作項目。下列以 C 程式碼表現 Ruby 中的 &lt;code&gt;break&lt;/code&gt;, &lt;code&gt;next,&lt;/code&gt; 和 &lt;code&gt;redo&lt;/code&gt; 之作用:&lt;/p&gt;

&lt;textarea name="code" class="ruby"&gt;
while (condition) {
  label_redo:

    goto label_next;    /* Ruby's "next" */
    continue;

    goto label_break;   /* Ruby's "break" */
    break;

    goto label_redo;    /* Ruby's "redo" */

  label_next:
}
label_break:

&lt;/textarea&gt;


&lt;p&gt;
第四種離開迴圈的方式是 &lt;code&gt;return&lt;/code&gt; 。它不只是脫離迴圈，也會脫離包含這迴圈的方法(method)。如果給它一個引數，該引數將視為方法的回傳值，而不是傳回 &lt;code&gt;nil&lt;/code&gt; 。&lt;/p&gt;

&lt;h3&gt;&lt;code&gt;for&lt;/code&gt;&lt;/h3&gt;
&lt;!-- RDLabel: "for" --&gt;

&lt;p&gt;
Ruby 的 &lt;code&gt;for&lt;/code&gt; 可提供與 C 的 &lt;code&gt;for&lt;/code&gt; 相同的功用，但更有彈性。迴圈可以自行從一個聚合體(colection) - 如陣列、雜湊表、連續數值範圍等等 - 提取一個元素執行，而不需程序員指示它怎麼做:
&lt;/p&gt;
&lt;textarea name="code" class="ruby"&gt;
for elt in colection
    # 在此處， elt 參照聚合體中的一個元素。
end
&lt;/textarea&gt;

&lt;p&gt;聚合體也可以是一個數值範圍，這用法便是多數人所說的 for 迴圈用法:&lt;/p&gt;
&lt;textarea name="code" class="ruby"&gt;
irb&gt; for num in (4..6)
irb&gt;     puts num
irb&gt; end
4
5
6
=&gt; 4..6
&lt;/textarea&gt;

&lt;p&gt;此例示範如何從頭到尾一一處理陣列元素:&lt;/p&gt;
&lt;textarea name="code" class="ruby"&gt;
for elt in [100, -9.6, "pickle"]
    puts "#{elt}\t(#{elt.class})
end
100     (Fixnum)
-9.6    (Float)
pickle  (String)
=&gt; [100, -9.6, "pickle"]
&lt;/textarea&gt;

&lt;p&gt;最後我們稍微超前進度，先預習一下迭代運算的內容。&lt;code&gt;for&lt;/code&gt; 其實就是迭代運算之 &lt;code&gt;each&lt;/code&gt; 方法的另一種寫法。下列兩種句型之意義相等:&lt;/p&gt;
&lt;textarea name="code" class="ruby"&gt;
# C 程序員會喜歡這個:
for element in collection
    #... do something
end

# Smalltalk 程序員會喜歡這個:
collection.each {|element|
    #... do something
}
&lt;/textarea&gt;

&lt;p&gt;
迭代運算通常可以取代傳統的迴圈，一般說來使用迭代會方便得多。下一章我們將學到更多關於它的內容。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3131360903311377656-5816047317140474857?l=rock-say-ruby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rock-say-ruby.blogspot.com/feeds/5816047317140474857/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3131360903311377656&amp;postID=5816047317140474857' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3131360903311377656/posts/default/5816047317140474857'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3131360903311377656/posts/default/5816047317140474857'/><link rel='alternate' type='text/html' href='http://rock-say-ruby.blogspot.com/2007/02/ruby-users-guidecontrol-structures.html' title='Ruby User&apos;s Guide::Control structures'/><author><name>rock</name><uri>http://www.blogger.com/profile/04065431701479848049</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3131360903311377656.post-2227189097928014152</id><published>2007-02-25T07:30:00.000-08:00</published><updated>2007-02-25T07:51:09.231-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby guide'/><title type='text'>Ruby User's Guide::Back to the simple examples</title><content type='html'>&lt;h3&gt;回顧範例&lt;/h3&gt;
English version: &lt;a href="http://www.rubyist.net/~slagell/ruby/backtoexamples.html"&gt;Back to the simple examples&lt;/a&gt;

&lt;p&gt;現在，我們說明一些先前的範例程式碼。&lt;/p&gt;
&lt;p&gt;下列是「&lt;a href="http://rock-say-ruby.blogspot.com/2007/02/ruby-users-guidesimple-examples.html"&gt;simple examples&lt;/a&gt;」一節中出現的程式碼。&lt;/p&gt;
&lt;textarea name="code" class="ruby"&gt;
def fact(n)
    if n == 0
        1
    else
        n * fact(n-1)
    end
end
puts fact(ARGV[0].to_i)
&lt;/textarea&gt;

&lt;p&gt;因為這是第一次解釋，我們一行行個別審視。&lt;/p&gt;

&lt;h3&gt;&lt;a name="label-0" id="label-0"&gt;階乘 (Factorials)&lt;/a&gt;&lt;/h3&gt;&lt;!-- RDLabel: "Factorials" --&gt;
&lt;textarea name="code" class="ruby:fisrtline[1]"&gt;
def fact(n)
&lt;/textarea&gt;
&lt;p&gt;第一行中， &lt;code&gt;def&lt;/code&gt; 是定義一個函數 (或更明確地稱為 &lt;em&gt;方法 (method)&lt;/em&gt; ；我們稍候會於 &lt;a href="http://www.rubyist.net/~slagell/ruby/methods.html"&gt;方式 (methods)&lt;/a&gt; 一節中說明) 的敘述。此敘述具體指明了函數 &lt;code&gt;fact&lt;/code&gt; 有一個被稱為 &lt;code&gt;n&lt;/code&gt; 的引數 (argument) 。&lt;/p&gt;

&lt;textarea name="code" class="ruby:firstline[2]"&gt;
    if n == 0
&lt;/textarea&gt;
&lt;p&gt;敘述 &lt;code&gt;if&lt;/code&gt; 用於條件判斷，此處之條件為 n 是否等於 0 。當條件成立時便運行下一段程式碼；否則運行諸如 &lt;code&gt;else&lt;/code&gt; 之敘述後的程式碼。&lt;/p&gt;

&lt;textarea name="code" class="ruby:firstline[3]"&gt;
        1
&lt;/textarea&gt;
&lt;p&gt;當條件符合時， &lt;code&gt;if&lt;/code&gt; 敘述之運行結果為 1 。&lt;/p&gt;

&lt;textarea name="code" class="ruby:firstline[4]"&gt;
    else
&lt;/textarea&gt;
&lt;p&gt;若條件不符合，則運行從 &lt;code&gt;else&lt;/code&gt; 到 &lt;code&gt;end&lt;/code&gt; 之間的程式碼。&lt;/p&gt;

&lt;textarea name="code" class="ruby:firstline[5]"&gt;
        n * fact(n-1)
&lt;/textarea&gt;
&lt;p&gt;當條件不符合時， &lt;code&gt;if&lt;/code&gt; 敘述的運行結果為運算 &lt;code&gt;n&lt;/code&gt; 乘以 &lt;code&gt;fact(n-1)&lt;/code&gt; 。&lt;/p&gt;

&lt;textarea name="code" class="ruby:firstline[6]"&gt;
    end
&lt;/textarea&gt;
&lt;p&gt;第一個 &lt;code&gt;end&lt;/code&gt; 結束 &lt;code&gt;if&lt;/code&gt; 敘述。&lt;/p&gt;

&lt;textarea name="code" class="ruby:firstline[7]"&gt;
end
&lt;/textarea&gt;
&lt;p&gt;第二個 &lt;code&gt;end&lt;/code&gt; 結束 &lt;code&gt;def&lt;/code&gt; 敘述。&lt;/p&gt;

&lt;textarea name="code" class="ruby:firstline[8]"&gt;
puts fact(ARGV[0].to_i)
&lt;/textarea&gt;
&lt;p&gt;以一個來自命令列的值作為引數調用我們的 &lt;code&gt;fact()&lt;/code&gt; 函數，並印出結果。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;ARGV&lt;/code&gt; 是一個容納了命令列引數的陣列。由於 &lt;code&gt;ARGV&lt;/code&gt; 的成員是字串，我們必須用 &lt;code&gt;to_i&lt;/code&gt; 將其轉換成一個整數。 Ruby 不會像 Perl 那樣自動轉換字串為整數。&lt;/p&gt;

&lt;p&gt;當我們提供一個負數給這程式時會發生什麼事呢？你看出問題了嗎？可以修正它嗎？&lt;/p&gt;

&lt;h3&gt;&lt;a name="label-1" id="label-1"&gt;字串 (Strings)&lt;/a&gt;&lt;/h3&gt;&lt;!-- RDLabel: "Strings" --&gt;

&lt;p&gt;下一個解釋的範例是 &lt;a href="http://rock-say-ruby.blogspot.com/2007/02/ruby-users-guidestrings.html"&gt;字串 (strings)&lt;/a&gt; 一節的猜謎程式。&lt;/p&gt;

&lt;textarea name="code" class="ruby"&gt;
words = ['foobar', 'baz', 'quux']
secret = words[rand(3)]

print "guess? "
while guess = STDIN.gets
    guess.chop!
    if guess == secret
        puts "You win!"
        break
    else
        puts "Sorry, you lose."
    end
    print "guess? "
end
puts "the word is ", secret, "."
&lt;/textarea&gt;

&lt;p&gt;在這程式中，使用了新的控制結構 &lt;code&gt;while&lt;/code&gt; 。當指定的條件為真時，就會重複執行在 &lt;code&gt;while&lt;/code&gt; 和其對應的 &lt;code&gt;end&lt;/code&gt; 之間的程式碼。在此例中， &lt;code&gt;guess = STDIN.gets&lt;/code&gt; 既是一個動作敘述 (收集使用者輸入的一行內容並儲存在 &lt;code&gt;guess&lt;/code&gt; 變數中)，也是一個條件 (若 &lt;code&gt;guess&lt;/code&gt; 沒有輸入內容，亦即算式 &lt;code&gt;guess = STDIN.gets&lt;/code&gt; 之值為 &lt;code&gt;nil&lt;/code&gt;時，則中止 &lt;code&gt;while&lt;/code&gt; 迴圈)。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;STDIN&lt;/code&gt; 是標準輸入設備。通常 &lt;code&gt;guess = gets&lt;/code&gt; 和 &lt;code&gt;guess = STDIN.gets&lt;/code&gt; 做的事一樣。&lt;/p&gt;

&lt;p&gt;第2行的 &lt;code&gt;rand(3)&lt;/code&gt; 傳回介於 0 到 2 之間的亂數。此亂數用於自陣列 &lt;code&gt;words&lt;/code&gt; 中提取一個內容。&lt;/p&gt;

&lt;p&gt;在第5行中，我們以方法 &lt;code&gt;STDIN.gets&lt;/code&gt; 自標準輸入設備中讀取一行內容。遇到 &lt;em&gt;EOF&lt;/em&gt; (檔案結束) 時， &lt;code&gt;gets&lt;/code&gt; 傳回 &lt;code&gt;nil&lt;/code&gt; 。故將此程式碼與 &lt;code&gt;while&lt;/code&gt; 合起來可令其重複執行至遇到 &lt;em&gt;^D&lt;/em&gt; (在 DOS/Windows 下則用 &lt;em&gt;^Z&lt;/em&gt; 或 &lt;em&gt;F6&lt;/em&gt;) 為止，意味著結束輸入。&lt;/p&gt;

&lt;p&gt;第6行的 &lt;code&gt;guess.chop!&lt;/code&gt; 刪去儲存在 &lt;code&gt;guess&lt;/code&gt; 中的最後一個字元；因為 &lt;code&gt;gets&lt;/code&gt; 會將使用者按下的 &lt;em&gt;Return&lt;/em&gt; 儲存為一個 &lt;em&gt;換行 (newline)&lt;/em&gt; 字元，但我們對換行字元不感興趣，故在此例中將會刪去該 &lt;em&gt;換行 (newline)&lt;/em&gt; 字元。&lt;/p&gt;

&lt;p&gt;第15行印出密語。我們寫下 &lt;code&gt;puts&lt;/code&gt; (&lt;code&gt;put s&lt;/code&gt;tring) 附帶2個引數的敘述，這將印出一個引數後接著印出下一個。這和將 &lt;code&gt;secret&lt;/code&gt; 寫成 &lt;code&gt;#{secret}&lt;/code&gt; 而變成單一引數的作法有相同效果，令它更清楚地表示有一個變數將運算，而非單純地逐字印出：&lt;/p&gt;
&lt;textarea name="code" class="ruby:nogutter"&gt;
puts "the word is #{secret}."
&lt;/textarea&gt;

&lt;p&gt;許多程序員覺得這麼做可以清楚地表達要輸出的內容：它建立了單一字串作為 &lt;code&gt;puts&lt;/code&gt; 的一個引數。&lt;/p&gt;
&lt;p&gt;我們現在應用這個想法作為標準的輸出敘述，但這次用 &lt;code&gt;print&lt;/code&gt; 代替第 4 和 13 行的 &lt;code&gt;puts&lt;/code&gt; 。它們是不一樣的。 &lt;code&gt;print&lt;/code&gt; 精確地輸出提供給它的內容； &lt;code&gt;puts&lt;/code&gt; 則會加上一個換行。在第 4 和 13 行使用 &lt;code&gt;print&lt;/code&gt; 可令游標停留在下一格，而不會移動到下一行開頭。這可作為使用者輸入之提示用途。通常，下列 4 個輸出呼叫方式之結果相同：&lt;/p&gt;
&lt;textarea name="code" class="ruby"&gt;
# 若輸出內容中沒有換行，則 puts 會含蓄地加上：
puts "Esmerelda, died in a fit of penguins."

# 使用 print 時必須明確地加上換行：
print "Esmerelda, died in a fit of penguins.\n"

# 你可以用 + 連接輸出內容：
print 'Esmerelda, died in a fit of penguins.' + "\n"

# 或提供多個字串：
print 'Esmerelda, died in a fit of penguins.', "\n"

&lt;/textarea&gt;

&lt;p&gt;有一件事你可能需要知道：有時文字視窗會用緩衝區控制個別字元的輸出速度，只有當它遇換行字元時才會輸出緩衝區的資料。所以當猜謎程式無法如預期般顯示輸入提示時，就是內容被放入緩衝區了。想確保這事不會發生，那麼你可用 &lt;code&gt;flush&lt;/code&gt; 立即送出你要顯示的提示文字。它告訴標準輸出設備 (名為 &lt;code&gt;STDOUT&lt;/code&gt; 的個體)："別等了；現在就顯示緩衝區的內容。"&lt;/p&gt;

&lt;textarea name="code" class="ruby:firstline[4]"&gt;
    print "guess? "; STDOUT.flush
&lt;/textarea&gt;


&lt;h3&gt;&lt;a name="label-2" id="label-2"&gt;字樣規則式 (Regular expressions)&lt;/a&gt;&lt;/h3&gt;&lt;!-- RDLabel: "Regular expressions" --&gt;
&lt;p&gt;最後我們要說明  &lt;a href="http://rock-say-ruby.blogspot.com/2007/02/ruby-users-guideregular-expressions.html"&gt;字樣規則式&lt;/a&gt; 一節的範例。&lt;/p&gt;

&lt;textarea name="code" class="ruby"&gt;
st = "\033[7m"
en = "\033[m"

puts "Enter an empty string at any time to exit."

while true
    print "str&gt; "; STDOUT.flush; str=gets.chop
    break if str.empty?
    print "pat&gt; "; STDOUT.flush; pat=gets.chop
    break if pat.empty?
    re = Regexp.new(pat)
    puts str.gsub(re, "#{st}\\&amp;#{en}")
end
&lt;/textarea&gt;

&lt;p&gt;第 6 行的 &lt;code&gt;while&lt;/code&gt; 條件式硬性指定為 &lt;code&gt;true&lt;/code&gt; ，故形成了一個無窮迴圈。然而我們在第 8 及 10 行放了 &lt;code&gt;break&lt;/code&gt; 敘述可脫離迴圈。這兩個 &lt;code&gt;break&lt;/code&gt; 敘述也示範了 "&lt;code&gt;if&lt;/code&gt; 修飾片語" 的用法。 &lt;code&gt;if&lt;/code&gt; 修飾片語表示只有條件成立時才會執行其左手邊的敘述。此一由右到左的演算邏輯並不常見，但它提供了更貼近日常用語的表達形式。由於它不需要 &lt;code&gt;end&lt;/code&gt; 敘述，所以也帶來了敘述簡潔的優點。 &lt;code&gt;if&lt;/code&gt; 修飾片語慣例上用於敘述需要加上條件判斷且條件式可以簡短地在一行中寫完的情況。&lt;/p&gt;

&lt;p&gt;注意，這程式的使用介面和猜謎程式並不相同。它允許使用者在未輸入其他內容時按下 &lt;em&gt;Return&lt;/em&gt; 鍵離開程式。故我們測試輸入字串是否為空的，而非是否不存在。&lt;/p&gt;
&lt;p&gt;第 7 和 9 行中，我們用了 "非破壞性 (non-destructive)" 的 chop ；這同樣可使我們自 &lt;code&gt;gets&lt;/code&gt; 得到一個不含換行字元的輸入內容。那與 "破壞性 (destructive)" 的 chop 有何不同呢？在 Ruby 中，我們按慣例會取 '&lt;code&gt;!&lt;/code&gt;' 或 '&lt;code&gt;?&lt;/code&gt;' 作為某些函數名稱的最後一字。 &lt;code&gt;!&lt;/code&gt; 又可唸成 "碰!" ，這可指示此函數可能具有破壞性，亦即它會改變它所接觸的個體之內容。 &lt;code&gt;chop!&lt;/code&gt; 直接影響原本的字串，而 &lt;code&gt;chop&lt;/code&gt; 則在不傷害原本內容之情形下給你一個刪減過的複製品。底下以實例示範兩者差異。&lt;/p&gt;

&lt;textarea name="code" class="ruby:nogutter"&gt;
ruby&gt; s1 = "forth"
    "forth"
ruby&gt; s1.chop!      # 改變了 s1
    "fort"
ruby&gt; s2 = s1.chop  # 將改變過的副本放在 s2
    "for"
ruby&gt; s1            # s1 不受影嚮
    "fort"
&lt;/textarea&gt;

&lt;p&gt;第 8 及 10 行顯示了另一個方法命名慣例。一個問號 (&lt;code&gt;?&lt;/code&gt;) 指示這是一個邏輯斷言方法，只回傳 &lt;code&gt;true&lt;/code&gt; 或 &lt;code&gt;false&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;第 11 行根據使用者輸入的字串內容建立了一個字樣規則式。真正的工作則於第 12 行中完成，它用 &lt;code&gt;gsub&lt;/code&gt; 全面性地將 ANSI 標記置入符合樣式的文字內容前後。&lt;/p&gt;

&lt;p&gt;我們可以把第 12 行拆成：&lt;/p&gt;
&lt;textarea name="code" class="ruby:firstline[12]"&gt;
highlighted = str.gsub(re, "#{st}\\&amp;#{en}")
puts highlighted
&lt;/textarea&gt;

&lt;p&gt;或者用 "破壞性" 作風：&lt;/p&gt;
&lt;textarea name="code" class="ruby:firstline[12]"&gt;
str.gsub!(re, "#{st}\\&amp;#{en}")
puts str
&lt;/textarea&gt;

&lt;p&gt;再次看看第 12 行的最後一部份。 &lt;code&gt;st&lt;/code&gt; 和 &lt;code&gt;en&lt;/code&gt; 是被定義在第 1-2 行 ANSI 的控制碼組合，這可讓文字改變顯示顏色。第 12 行中用 &lt;code&gt;#{}&lt;/code&gt; 將這兩個變數之值嵌入字串中。兩者間的 &lt;code&gt;\\&amp;amp;&lt;/code&gt; 則是一個技巧性用法。因為這個字串是以雙引號括起的，所以其中的一對斜線字元會被替換成單一個斜線字元，故 &lt;code&gt;gsub&lt;/code&gt; 實際看到的是 &lt;code&gt;\&amp;amp;&lt;/code&gt; 。這可令 &lt;code&gt;gsub&lt;/code&gt; 將符合字樣的文字內容置換於此，所以就可以顯示用高亮度色彩標示符合字樣內容的字串了。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3131360903311377656-2227189097928014152?l=rock-say-ruby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rock-say-ruby.blogspot.com/feeds/2227189097928014152/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3131360903311377656&amp;postID=2227189097928014152' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3131360903311377656/posts/default/2227189097928014152'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3131360903311377656/posts/default/2227189097928014152'/><link rel='alternate' type='text/html' href='http://rock-say-ruby.blogspot.com/2007/02/ruby-users-guideback-to-simple-examples.html' title='Ruby User&apos;s Guide::Back to the simple examples'/><author><name>rock</name><uri>http://www.blogger.com/profile/04065431701479848049</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3131360903311377656.post-2508725654527598217</id><published>2007-02-24T02:39:00.000-08:00</published><updated>2007-02-24T02:52:28.574-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby guide'/><title type='text'>Ruby User's Guide::Arrays</title><content type='html'>&lt;h3&gt;陣列 (Arrays)&lt;/h3&gt;
English version: &lt;a href="http://www.rubyist.net/~slagell/ruby/arrays.html"&gt;Arrays&lt;/a&gt;

&lt;p&gt;你可以用方括號 (&lt;code&gt;[ ]&lt;/code&gt;) 建立一個&lt;em&gt;陣列&lt;/em&gt; ，並在其中以逗號分隔列出各個細項。 Ruby 的陣列可以容納各式各樣的個體。&lt;/p&gt;
&lt;textarea name="code" class="ruby:nogutter"&gt;
ruby&gt; ary = [1, 2, "3"]
   [1, 2, "3"]
&lt;/textarea&gt;

&lt;p&gt;陣列就像字串一樣可以連接也可以重複。&lt;/p&gt;
&lt;textarea name="code" class="ruby:nogutter"&gt;
ruby&gt; ary + ["foo", "bar"]
   [1, 2, "3", "foo", "bar"]
ruby&gt; ary * 2
   [1, 2, "3", 1, 2, "3"]
&lt;/textarea&gt;

&lt;p&gt;我們可以用數字作為索引，提取陣列的任何一部份。&lt;/p&gt;
&lt;textarea name="code" class="ruby:nogutter"&gt;
ruby&gt; ary[0]
   1
ruby&gt; ary[0,2]
   [1, 2]
ruby&gt; ary[0..1]
   [1, 2]
ruby&gt; ary[-2]
   2
ruby&gt; ary[-2,2]
   [2, "3"]
ruby&gt; ary[-2..-1]
   [2, "3"]
&lt;/textarea&gt;

&lt;p&gt;(負號指示自陣列尾端取偏移量而非從陣列開頭。)&lt;/p&gt;
&lt;p&gt;陣列可用 &lt;code&gt;join&lt;/code&gt; 轉成字串，字串也用 &lt;code&gt;split&lt;/code&gt; 轉成陣列：&lt;/p&gt;
&lt;textarea name="code" class="ruby:nogutter"&gt;
ruby&gt; str = ary.join(":")
   "1:2:3"
ruby&gt;  str.split(":")
   ["1", "2", "3"]
&lt;/textarea&gt;

&lt;a name="label-0" id="label-0"&gt;&lt;/a&gt;
&lt;h3&gt;雜湊表 (Hashes)&lt;/h3&gt;&lt;!-- RDLabel: "Hashes" --&gt;

&lt;p&gt;有種稱為「關聯索引陣列 (associative array)」的特殊陣列，它不是用有序的數字索引提取內容，而是用無序的&lt;em&gt;關鍵字(keys)&lt;/em&gt;。這種陣列有時又稱之為 &lt;em&gt;雜湊表 (hash)&lt;/em&gt; 或 &lt;em&gt;字典 (dictionary)&lt;/em&gt; ；在 Ruby 的世界中，我們慣用 &lt;em&gt;雜湊表&lt;/em&gt; 一詞。我們可以用一對大括號 (&lt;code&gt;{ }&lt;/code&gt;) 括起各對細項 (關鍵字 =&amp;gt; 內容) 以建立雜湊表。在編程時，用雜湊表的時機將比用陣列的時機要多。&lt;/p&gt;
&lt;textarea name="code" class="ruby:nogutter"&gt;
ruby&gt; h = {1 =&gt; 2, "2" =&gt; "4"}
   {1=&gt;2, "2"=&gt;"4"}
ruby&gt; h[1]
   2
ruby&gt; h["2"]
   4
ruby&gt; h[5]
   nill
ruby&gt; h[5] = 10     # appending an entry
   10
ruby&gt; h
   {5=&gt;10, 1=&gt;2, "2"=&gt;"4"}
ruby&gt; h.delete 1    # deleting an entry by key
   2
ruby&gt; h[1]
   nil
ruby&gt; h
   {5=&gt;10, "2"=&gt;"4"}
&lt;/textarea&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3131360903311377656-2508725654527598217?l=rock-say-ruby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rock-say-ruby.blogspot.com/feeds/2508725654527598217/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3131360903311377656&amp;postID=2508725654527598217' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3131360903311377656/posts/default/2508725654527598217'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3131360903311377656/posts/default/2508725654527598217'/><link rel='alternate' type='text/html' href='http://rock-say-ruby.blogspot.com/2007/02/ruby-users-guidearrays.html' title='Ruby User&apos;s Guide::Arrays'/><author><name>rock</name><uri>http://www.blogger.com/profile/04065431701479848049</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3131360903311377656.post-2044252319574693225</id><published>2007-02-21T06:39:00.000-08:00</published><updated>2007-02-24T02:49:58.074-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby guide'/><title type='text'>Ruby User's Guide::Regular expressions</title><content type='html'>&lt;h3&gt;字樣規則式 (Regular expressions)&lt;/h3&gt;
English version: &lt;a href="http://www.rubyist.net/~slagell/ruby/regexp.html"&gt;Regular expressions&lt;/a&gt;

&lt;p&gt;讓我們一起開始更有趣的程式吧。這次我們測試一個字串是否符合一個簡明扼要的&lt;em&gt;樣式 (pattern)&lt;/em&gt; 。&lt;/p&gt;
&lt;p&gt;在樣式中有一些字元和字元組合具有特殊用意，包含下列：&lt;/p&gt;
&lt;table border="1"&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;[]&lt;/code&gt; &lt;/td&gt;&lt;td&gt; 指定範圍 (例如： &lt;code&gt;[a-z]&lt;/code&gt; 表示一個在 &lt;code&gt;a&lt;/code&gt; 到 &lt;code&gt;z&lt;/code&gt; 範圍內的字母) &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;code&gt;\w&lt;/code&gt; &lt;/td&gt;&lt;td&gt; 字母或十進位數之字元；與 &lt;code&gt;[0-9A-Za-z]&lt;/code&gt; 相同&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;code&gt;\W&lt;/code&gt; &lt;/td&gt;&lt;td&gt; 非字母與十進位數之字元&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;code&gt;\s&lt;/code&gt; &lt;/td&gt;&lt;td&gt; 空白字元；與 &lt;code&gt;[ \t\n\r\f]&lt;/code&gt; 相同&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;code&gt;\S&lt;/code&gt; &lt;/td&gt;&lt;td&gt; 非空白字元&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;code&gt;\d&lt;/code&gt; &lt;/td&gt;&lt;td&gt; 十進位數之字元；與 &lt;code&gt;[0-9]&lt;/code&gt; 相同&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;code&gt;\D&lt;/code&gt; &lt;/td&gt;&lt;td&gt; 非十進位數之字元&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;code&gt;\b&lt;/code&gt; &lt;/td&gt;&lt;td&gt; 退格 (0x08) (若用於指定範圍時)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;code&gt;\b&lt;/code&gt; &lt;/td&gt;&lt;td&gt; 單字邊界 (若不用於指定範圍時)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;code&gt;\B&lt;/code&gt; &lt;/td&gt;&lt;td&gt; 非單字邊界&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;code&gt;*&lt;/code&gt; &lt;/td&gt;&lt;td&gt; 零到數個其前一符號的內容。&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;code&gt;+&lt;/code&gt; &lt;/td&gt;&lt;td&gt; 一到數個其前一符號的內容&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;code&gt;{m,n}&lt;/code&gt; &lt;/td&gt;&lt;td&gt; 最少 m 個且最多 n 個其前一符號的內容&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;code&gt;?&lt;/code&gt; &lt;/td&gt;&lt;td&gt; 零到一個其前一符號的內容；與 &lt;code&gt;{0,1}&lt;/code&gt; 相同&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;code&gt;|&lt;/code&gt; &lt;/td&gt;&lt;td&gt; 符合 '|' 之前一符號或後一符號的內容&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;code&gt;()&lt;/code&gt; &lt;/td&gt;&lt;td&gt; 分組&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;一般以 &lt;em&gt;字樣規則式 (regular expressions)&lt;/em&gt; 稱呼使用這種奇妙字彙的樣式。 Ruby 和 Perl 一樣用斜線 (/) 包圍樣式內容而不是用引號。若你以前從未用過字樣規則式，它們或許看起來像任何東西但仍然有&lt;em&gt;規律性&lt;/em&gt;。但你應明智地花一些時間熟悉它們。它們具有強大及有效率的表達能力。當你需要進行樣式比對、搜尋、或其他文字字串之操縱時，它們將省去許多令人頭痛的事 (和許多行程式碼)。&lt;/p&gt;
&lt;p&gt;舉個例子，假設我們想要測試一個字串是否符合此一描述："以小寫 f 開始，緊跟著一個大寫字母；之後可能有一些廢話，只要其中沒有任何小寫字母。" 若你是個老練的 C 程序員，你腦海中或許已經寫下幾十行程式碼了，對吧？承認吧，你是在自找麻煩。在 Ruby 中，你只需要用這個字樣規則式 &lt;code&gt;/^f[A-Z][^a-z]*$/&lt;/code&gt; 就可以測試你的字串了。&lt;/p&gt;
&lt;p&gt;那麼 "包含以角括號圈住的十六進位數字？" 又如何？沒問題。&lt;/p&gt;
&lt;textarea name="code" class="ruby:nogutter"&gt;
ruby&gt; def chab(s)   # "contains hex in angle brackets"
    |    (s =~ /&lt;0(x|x)(\d|[a-f]|[a-f])+&gt;/) != nil
    | end
  nil
ruby&gt; chab "Not this one."
  false
ruby&gt; chab "Maybe this? {0x35}"    # wrong kind of brackets
  false
ruby&gt; chab "Or this? &lt;0x38z7e&gt;"    # bogus hex digit
  false
ruby&gt; chab "Okay, this: &lt;0xfc0004&gt;."
  true
&lt;/textarea&gt;
&lt;p&gt;儘管字樣規則式一眼看來像個謎語，你仍將很快地為了它所能節省的許多表達功夫而感到滿意。&lt;/p&gt;
&lt;p&gt;此處是一個幫助你試驗字樣規則式的小程式。將它儲存為 &lt;code&gt;regx.rb&lt;/code&gt; 並在命令列下鍵入 &lt;code&gt;"ruby regx.rb"&lt;/code&gt; 起動它。&lt;/p&gt;
&lt;textarea name="code" class="ruby:nogutter"&gt;
# Requires an ANSI terminal!

st = "\033[7m"
en = "\033[m"

puts "Enter an empty string at any time to exit."

while true
  print "str&gt; "; STDOUT.flush; str = gets.chop
  break if str.empty?
  print "pat&gt; "; STDOUT.flush; pat = gets.chop
  break if pat.empty?
  re = Regexp.new(pat)
  puts str.gsub(re,"#{st}\\&amp;#{en}")
end
&lt;/textarea&gt;
&lt;p&gt;這程式要求輸入兩次，第一次要輸入一個字串，另一次要輸入一個字樣規則。這字串與字樣規則進行比對測試，然後以高亮度反白顯示所有匹配的部份。現在先別管細節，這程式碼的分析工作很快就會做了。&lt;/p&gt;
&lt;pre&gt;
str&amp;gt; foobar
pat&amp;gt; ^fo+
&lt;span style="color:red;"&gt;&lt;b&gt;foo&lt;/b&gt;&lt;/span&gt;bar
~~~
&lt;/pre&gt;
&lt;p&gt;讓我們嘗試輸入一些東西吧。&lt;/p&gt;
&lt;pre&gt;
str&amp;gt; abc012dbcd555
pat&amp;gt; \d
abc&lt;span style="color:red;"&gt;&lt;b&gt;012&lt;/b&gt;&lt;/span&gt;dbcd&lt;span style="color:red;"&gt;&lt;b&gt;555&lt;/b&gt;&lt;/span&gt;
&lt;span style="color:#50ffff;"&gt;&lt;b&gt;   ~~~    ~~~&lt;/b&gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;若你感到訝異，參考上面的表格： &lt;code&gt;\d&lt;/code&gt; 與字元 &lt;code&gt;d&lt;/code&gt; 無關，但符合一個十進位數字。&lt;/p&gt;
&lt;p&gt;若有一個以上的結果符合樣式呢？&lt;/p&gt;
&lt;pre&gt;
str&amp;gt; foozboozer
pat&amp;gt; f.*z
&lt;span style="color:red;"&gt;&lt;b&gt;foozbooz&lt;/b&gt;&lt;/span&gt;er
~~~~~~~~
&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;foozbooz&lt;/code&gt; 將符合而不是 &lt;code&gt;fooz&lt;/code&gt; ，因為字樣規則會配對符合字樣的最長字串。&lt;/p&gt;
&lt;p&gt;此為一解析以冒號區隔時間欄位的字串的樣式。&lt;/p&gt;
&lt;pre&gt;
str&amp;gt; Wed Feb  7 08:58:04 JST 1996
pat&amp;gt; [0-9]+:[0-9]+(:[0-9]+)?
Wed Feb  7 &lt;span style="color:red;"&gt;&lt;b&gt;08:58:04&lt;/b&gt;&lt;/span&gt; JST 1996
           ~~~~~~~~
&lt;/pre&gt;
&lt;p&gt;"&lt;code&gt;=~&lt;/code&gt;" 是關於字樣規則比對的運算符號；它回傳符合樣式之字串內容的位置，若無符合者則回傳 &lt;code&gt;nil&lt;/code&gt;。&lt;/p&gt;
&lt;textarea name="code" class="ruby:nogutter"&gt;
ruby&gt; "abcdef" =~ /d/
   3
ruby&gt; "aaaaaa" =~ /d/
   nil
&lt;/textarea&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3131360903311377656-2044252319574693225?l=rock-say-ruby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rock-say-ruby.blogspot.com/feeds/2044252319574693225/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3131360903311377656&amp;postID=2044252319574693225' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3131360903311377656/posts/default/2044252319574693225'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3131360903311377656/posts/default/2044252319574693225'/><link rel='alternate' type='text/html' href='http://rock-say-ruby.blogspot.com/2007/02/ruby-users-guideregular-expressions.html' title='Ruby User&apos;s Guide::Regular expressions'/><author><name>rock</name><uri>http://www.blogger.com/profile/04065431701479848049</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3131360903311377656.post-6695449731183671940</id><published>2007-02-21T05:33:00.000-08:00</published><updated>2007-02-24T02:48:54.338-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby guide'/><title type='text'>Ruby User's Guide::Strings</title><content type='html'>&lt;h3&gt;字串 (Strings)&lt;/h3&gt;
English version: &lt;a href="http://www.rubyist.net/~slagell/ruby/strings.html"&gt;Strings&lt;/a&gt;
&lt;p&gt;Ruby 可以像數值資料般妥善處理字串。字串是一個被雙引號 ("...") 或單引號 ('...') 括起的內容。&lt;/p&gt;
&lt;textarea name="code" class="ruby:nogutter"&gt;
ruby&gt; "abc"
   "abc"
ruby&gt; 'abc'
   "abc"
&lt;/textarea&gt;
&lt;p&gt;雙引號和單引號在某些案例上具有不同的效果。由雙引號括起的字串允許添加一個引導的反斜線 (\) 在字元前轉換該字元之意義，也可以 &lt;code&gt;#{}&lt;/code&gt; 嵌入一段賦值的式子。由單引號括起的字串不做這些解釋工作；你將得到你所看到的。例如：&lt;/p&gt;
&lt;textarea name="code" class="ruby:nogutter"&gt;
ruby&gt; puts "a\nb\nc"
a
b
c
   nil
ruby&gt; puts 'a\nb\n'
a\nb\nc
   nil
ruby&gt; "\n"
   "\n"
ruby&gt; '\n'
   "\\n"
ruby&gt; "\001"
   "\001"
ruby&gt; '\001'
   "\\001"
ruby&gt; "abcd #{5*3} efg"
   "abcd 15 efg"
ruby&gt; var = " abc "
   " abc "
ruby&gt; "1234#{var}5678"
   "1234 abc 5678"
&lt;/textarea&gt;
&lt;p&gt;Ruby 的字串處理方式很聰明也比 C 的方式更直覺。舉例來說，你可以用 &lt;code&gt;+&lt;/code&gt; 連接多個字串，也可以用 &lt;code&gt;*&lt;/code&gt; 重複一個字串內容數次：&lt;/p&gt;
&lt;textarea name="code" class="ruby:nogutter"&gt;
ruby&gt; "foo" + "bar"
   "foobar"
ruby&gt; "foo" * 2
   "foofoo"
&lt;/textarea&gt;
&lt;p&gt;在 C 中連接多個字串較此笨拙許多，因為 C 需要清楚的記憶體管理措施：&lt;/p&gt;
&lt;textarea name="code" class="ruby:nogutter"&gt;
char *s = malloc(strlen(s1)+strlen(s2)+1);
strcpy(s, s1);
strcat(s, s2);
/* ... */
free(s);
&lt;/textarea&gt;
&lt;p&gt;但用 Ruby ，我們不需要考慮字串佔用的記憶體空間。我們可以擺脫各種記憶體管理措施。&lt;/p&gt;
&lt;p&gt;你可以對字串做這些事。&lt;/p&gt;
&lt;p&gt;連接：&lt;/p&gt;
&lt;textarea name="code" class="ruby:nogutter"&gt;
ruby&gt; word = "fo" + "o"
   "foo"
&lt;/textarea&gt;
&lt;p&gt;重複：&lt;/p&gt;
&lt;textarea name="code" class="ruby:nogutter"&gt;
ruby&gt; word = word * 2
   "foofoo"
&lt;/textarea&gt;
&lt;p&gt;摘錄字元 (記下， Ruby 中的字元也是整數)：&lt;/p&gt;
&lt;textarea name="code" class="ruby:nogutter"&gt;
ruby&gt; word[0]
   102            # 102 is ASCII code of 'f'
ruby&gt; word[-1]
   111            # 111 is ASCII code of 'o'
&lt;/textarea&gt;
&lt;p&gt;(負號指示從字串尾端計算偏移位置，而不是從字串開頭)&lt;/p&gt;
&lt;p&gt;摘錄部份字串：&lt;/p&gt;
&lt;textarea name="code" class="ruby:nogutter"&gt;
ruby&gt; herb = "parsley"
   "parsley"
ruby&gt; herb[0,1]
   "p"
ruby&gt; herb[-2,2]
   "ey"
ruby&gt; herb[0..3]
   "pars"
ruby&gt; herb[-5..-2]
   "rsle"
&lt;/textarea&gt;
&lt;p&gt;內容測試：&lt;/p&gt;
&lt;textarea name="code" class="ruby:nogutter"&gt;
ruby&gt; "foo" == "foo"
   true
ruby&gt; "foo" == "bar"
   false
&lt;/textarea&gt;
&lt;p&gt;現在，利用一些上述特性來設計一道猜謎程式。也許下列內容用 "猜謎" 這字眼太嚴肅了 &lt;code&gt;;-)&lt;/code&gt;&lt;/p&gt;
&lt;textarea name="code" class="ruby:nogutter"&gt;
# save this as guess.rb
words = ['foobar', 'baz', 'quux']
secret = words[rand(3)]

print "guess? "
while guess = STDIN.gets
  guess.chop!
  if guess == secret
    puts "You win!"
    break
  else
    puts "Sorry, you lose."
  end
  print "guess? "
end
puts "The word was ", secret, "."
&lt;/textarea&gt;
&lt;p&gt;現在還不需要煩惱這些程式碼的細節。這猜謎程式跑起來會像這樣：&lt;/p&gt;
&lt;pre&gt;
% ruby guess.rb
guess? foobar
Sorry, you lose.
guess? quux
Sorry, you lose.
guess? ^D
The word was baz.
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3131360903311377656-6695449731183671940?l=rock-say-ruby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rock-say-ruby.blogspot.com/feeds/6695449731183671940/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3131360903311377656&amp;postID=6695449731183671940' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3131360903311377656/posts/default/6695449731183671940'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3131360903311377656/posts/default/6695449731183671940'/><link rel='alternate' type='text/html' href='http://rock-say-ruby.blogspot.com/2007/02/ruby-users-guidestrings.html' title='Ruby User&apos;s Guide::Strings'/><author><name>rock</name><uri>http://www.blogger.com/profile/04065431701479848049</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3131360903311377656.post-764478531985206335</id><published>2007-02-20T00:28:00.000-08:00</published><updated>2007-02-24T02:49:18.821-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby guide'/><title type='text'>Ruby User's Guide::Simple examples</title><content type='html'>&lt;h3&gt;簡單範例&lt;/h3&gt;
English version: &lt;a href="http://www.rubyist.net/~slagell/ruby/examples.html"&gt;Simple examples&lt;/a&gt;

&lt;p&gt;我們來撰寫一個階乘計算函數。 &lt;code&gt;n&lt;/code&gt; 階乘的數學定義是：&lt;/p&gt;
&lt;pre&gt;
n! = 1              (when n==0)
   = n * (n-1)!     (otherwise)
&lt;/pre&gt;
&lt;p&gt;這用 ruby 寫成：&lt;/p&gt;
&lt;textarea name="code" class="ruby:nogutter"&gt;
def fact(n)
  if n == 0
    1
  else
    n * fact(n-1)
  end
end
&lt;/textarea&gt;
&lt;p&gt;你或許注意到 &lt;code&gt;end&lt;/code&gt; 重複出現了。因為此一特徵， Ruby 被稱之為 ALGOL 式語言。 (事實上， ruby 的語法更像在模仿名為 Eiffel 的語言。) 你也許注意到少了 &lt;code&gt;return&lt;/code&gt; 敘述。因為一個 ruby 函數會回傳最後一個計算結果，所以可省略 &lt;code&gt;return&lt;/code&gt; 。此處可允許使用 &lt;code&gt;return&lt;/code&gt; 敘述但非必要。&lt;/p&gt;
&lt;p&gt;接著試試我們的階乘函數。加上一行程式碼可令我們得到一個可做事的程式：&lt;/p&gt;
&lt;textarea name="code" class="ruby:nogutter"&gt;
# Program to find the factorial of a number
# Save this as fact.rb

def fact(n)
  if n == 0
    1
  else
    n * fact(n-1)
  end
end

puts fact(ARGV[0].to_i)
&lt;/textarea&gt;
&lt;p&gt;此處的 &lt;code&gt;ARGV&lt;/code&gt; 是一個含有命令列引數的陣列，而 &lt;code&gt;to_i&lt;/code&gt; 將字元字串轉換成一個整數。&lt;/p&gt;
&lt;textarea name="code" class="ruby:nogutter"&gt;
% ruby fact.rb 1
1
% ruby fact.rb 5
120
&lt;/textarea&gt;
&lt;p&gt;它可以接受引數為 40 嗎？這可能令此計算溢位...&lt;/p&gt;
&lt;textarea name="code" class="ruby:nogutter"&gt;&gt;
% ruby fact.rb 40
815915283247897734345611269596115894272000000000
&lt;/textarea&gt;
&lt;p&gt;它能做。 Ruby 甚至可能處理任何整數，只要你的機器有足夠的記憶體。所以 400! 也可計算：&lt;/p&gt;
&lt;textarea name="code" class="ruby:nogutter"&gt;
% ruby fact.rb 400
64034522846623895262347970319503005850702583026002959458684
44594280239716918683143627847864746326467629435057503585681
08482981628835174352289619886468029979373416541508381624264
61942352307046244325015114448670890662773914918117331955996
44070954967134529047702032243491121079759328079510154537266
72516278778900093497637657103263503315339653498683868313393
52024373788157786791506311858702618270169819740062983025308
59129834616227230455833952075961150530223608681043329725519
48526744322324386699484224042325998055516106359423769613992
31917134063858996537970147827206606320217379472010321356624
61380907794230459736069956759583609615871512991382228657857
95493616176544804532220078258184008484364155912294542753848
03558374518022675900061399560145595206127211192918105032491
00800000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000
&lt;/textarea&gt;
&lt;p&gt;我們無法一眼看出這是否正確，但它一定是正確的。 :-) &lt;/p&gt;

&lt;h3&gt;輸入與計算迴圈&lt;/h3&gt;
&lt;!-- RDLabel: "The input/evaluation loop" --&gt;
&lt;p&gt;當你不加任何引數喚起 ruby 時，它將自標準輸入裝置讀取命令，並在結束輸入之後執行這些命令：&lt;/p&gt;
&lt;textarea name="code" class="ruby:nogutter"&gt;
% ruby
puts "hello world"
puts "good-bye world"
^D
hello world
good-bye world
&lt;/textarea&gt;
&lt;p&gt;上述的 &lt;em&gt;^D&lt;/em&gt; 即鍵入 control-D ，這在 Unix 中是表示結束輸入的慣用符號。在 DOS/Windows 中，改為按下 &lt;em&gt;F6&lt;/em&gt; 或 &lt;em&gt;^Z&lt;/em&gt; 。&lt;/p&gt;
&lt;p&gt;Ruby 也可執行一個稱為 &lt;code&gt;eval.rb&lt;/code&gt; 的程式，這可讓你在互動式迴圈中從鍵盤輸入你的程式碼並顯示你的輸入結果。它會廣泛地出現在這入門書中。&lt;/p&gt;
&lt;p&gt;If you have an ANSI-compliant terminal (this is almost certainly true if you are running some flavor of UNIX; under old versions of DOS you need to have installed &lt;code&gt;ANSI.SYS&lt;/code&gt; or &lt;code&gt;ANSI.COM&lt;/code&gt;; Windows XP, unfortunately, has now made this nearly impossible), you should use this &lt;a href="http://www.rubyist.net/%7Eslagell/ruby/eval.txt"&gt;enhanced &lt;code&gt;eval.rb&lt;/code&gt;&lt;/a&gt; that adds visual indenting assistance, warning reports, and color highlighting. Otherwise, look in the &lt;code&gt;sample&lt;/code&gt; subdirectory of the ruby distribution for the non-ANSI version that works on any terminal. Here is a short &lt;code&gt;eval.rb&lt;/code&gt; session:&lt;/p&gt;
&lt;textarea name="code" class="ruby:nogutter"&gt;
% ruby eval.rb
ruby&gt; puts "Hello, world."
Hello, world.
   nil
ruby&gt; exit
&lt;/textarea&gt;
&lt;p&gt;&lt;code&gt;hello world&lt;/code&gt; 是 &lt;code&gt;puts&lt;/code&gt; 的輸出內容。此例中的下一行報告最後的計算結果為 &lt;code&gt;nil&lt;/code&gt;； Ruby 不會區別 &lt;em&gt;敘述 (statements)&lt;/em&gt; 和 &lt;em&gt;算式 (expressions)&lt;/em&gt; ，所以計算一段程式碼基本上意味視為相同事物執行。此處的 &lt;code&gt;nil&lt;/code&gt; 指出 &lt;code&gt;puts&lt;/code&gt; 並未回傳有意義的值。注意，我們可以鍵入 &lt;code&gt;exit&lt;/code&gt; 或 &lt;code&gt;^D&lt;/code&gt; 離開這個直譯迴圈。&lt;/p&gt;
&lt;p&gt;在本入門中， "&lt;code&gt;ruby&amp;gt;&lt;/code&gt;" 就是我們的小程式 &lt;code&gt;eval.rb&lt;/code&gt; 之輸入提示符號。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3131360903311377656-764478531985206335?l=rock-say-ruby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rock-say-ruby.blogspot.com/feeds/764478531985206335/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3131360903311377656&amp;postID=764478531985206335' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3131360903311377656/posts/default/764478531985206335'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3131360903311377656/posts/default/764478531985206335'/><link rel='alternate' type='text/html' href='http://rock-say-ruby.blogspot.com/2007/02/ruby-users-guidesimple-examples.html' title='Ruby User&apos;s Guide::Simple examples'/><author><name>rock</name><uri>http://www.blogger.com/profile/04065431701479848049</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3131360903311377656.post-7022784023299407444</id><published>2007-02-19T11:09:00.000-08:00</published><updated>2007-02-19T11:13:42.503-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><title type='text'>To Ruby From PHP</title><content type='html'>&lt;p&gt;&lt;a href="http://www.ruby-lang.org/en/documentation/ruby-from-other-languages/to-ruby-from-php/"&gt;To Ruby From PHP&lt;/a&gt; 之內容因為和 PHP 相關，所以我發佈在 &lt;a href="http://blog.roodo.com/rocksaying/archives/2726947.html"&gt;To Ruby From PHP, 中譯&lt;/a&gt;。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3131360903311377656-7022784023299407444?l=rock-say-ruby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rock-say-ruby.blogspot.com/feeds/7022784023299407444/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3131360903311377656&amp;postID=7022784023299407444' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3131360903311377656/posts/default/7022784023299407444'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3131360903311377656/posts/default/7022784023299407444'/><link rel='alternate' type='text/html' href='http://rock-say-ruby.blogspot.com/2007/02/to-ruby-from-php.html' title='To Ruby From PHP'/><author><name>rock</name><uri>http://www.blogger.com/profile/04065431701479848049</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3131360903311377656.post-6003951898557613552</id><published>2007-02-19T10:07:00.000-08:00</published><updated>2007-02-24T02:47:12.270-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby guide'/><title type='text'>Ruby User's Guide::Getting started</title><content type='html'>&lt;h3&gt;開始吧&lt;/h3&gt;
Engilsh version: &lt;a href="http://www.rubyist.net/%7Eslagell/ruby/getstarted.html"&gt;Getting started&lt;/a&gt;

&lt;p&gt;首先，你會想檢查 ruby 是否已經安裝了。在命令提示 (此處以 "%" 為提示符號，所以別輸入 %) 下輸入：&lt;/p&gt;
&lt;pre&gt;
% ruby -v
&lt;/pre&gt;
&lt;p&gt;(&lt;code&gt;-v&lt;/code&gt; 告知直譯器印出 ruby 的版本), 然後按下 &lt;em&gt;Enter&lt;/em&gt; 鍵。若 ruby 已安裝，你將會看到如下之訊息：&lt;/p&gt;
&lt;pre&gt;
% ruby -v
ruby 1.8.3 (2005-09-21) [i586-linux]
&lt;/pre&gt;

&lt;p&gt;若 ruby 尚未安裝，你可詢問系統管理者安裝，或者你可以自己裝，因為 ruby 是自由軟體，其安裝與使用皆不受限制。&lt;/p&gt; &lt;p&gt;現在，開始玩 ruby 吧。你可以在命令列下用 &lt;code&gt;-e&lt;/code&gt; 選項直接寫下 ruby 程式: &lt;/p&gt;
&lt;pre&gt;
% ruby -e 'puts "hello world"'
hello world
&lt;/pre&gt;

&lt;p&gt;照慣例，一個 ruby 程式可以儲存在一個檔案中。&lt;/p&gt;
&lt;pre&gt;
% echo "puts 'hello world'" &gt; hello.rb
% ruby hello.rb
hello world
&lt;/pre&gt;

&lt;p&gt;在撰寫比這內容更充實的程式碼時，你將會採用一個文字編輯工具！&lt;/p&gt;
&lt;p&gt;一些驚人地複雜且有用的小程式可以被塞在一道命令之中。例如下列這一個，它將目前工作目錄中所有 C 原始碼和標頭檔內的 &lt;code&gt;foo&lt;/code&gt; 替代成 &lt;code&gt;bar&lt;/code&gt; ，並將原始檔案名稱後添加 ".bak" 作為備份：&lt;/p&gt;
&lt;pre&gt;
% ruby -i.bak -pe 'sub "foo", "bar"' *.[ch]
&lt;/pre&gt;
&lt;p&gt;這程式之作用如同 UNIX &lt;code&gt;cat&lt;/code&gt; 命令 (但比 &lt;code&gt;cat&lt;/code&gt; 做的慢)：&lt;/p&gt;
&lt;pre&gt;
% ruby -pe 0 file
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3131360903311377656-6003951898557613552?l=rock-say-ruby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rock-say-ruby.blogspot.com/feeds/6003951898557613552/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3131360903311377656&amp;postID=6003951898557613552' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3131360903311377656/posts/default/6003951898557613552'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3131360903311377656/posts/default/6003951898557613552'/><link rel='alternate' type='text/html' href='http://rock-say-ruby.blogspot.com/2007/02/ruby-users-guidegetting-started.html' title='Ruby User&apos;s Guide::Getting started'/><author><name>rock</name><uri>http://www.blogger.com/profile/04065431701479848049</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3131360903311377656.post-5335486126560257536</id><published>2007-02-19T09:47:00.000-08:00</published><updated>2007-02-20T01:50:24.624-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby guide'/><title type='text'>Ruby User's Guide::What is ruby?</title><content type='html'>&lt;h3&gt;什麼是 Ruby?&lt;/h3&gt;
Engilsh version: &lt;a href="http://www.rubyist.net/~slagell/ruby/index.html"&gt;What is ruby?&lt;/a&gt;

&lt;p&gt;Ruby 是 "一個快速與易用於個體導向編程的直譯式手稿語言" -- 這是什麼意思?&lt;/p&gt; &lt;p&gt;&lt;em&gt;直譯式手稿語言:&lt;/em&gt;&lt;/p&gt; &lt;ul&gt;&lt;li&gt;有能力直接調用作業系統呼叫&lt;/li&gt;&lt;li&gt;強大的字串操作與字樣規則式 (RegExp)&lt;/li&gt;&lt;li&gt;開發時之立即回應&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&lt;em&gt;快速與易用:&lt;/em&gt;&lt;/p&gt; &lt;ul&gt;&lt;li&gt;不需要變數宣告&lt;/li&gt;&lt;li&gt;變數不用指定類型&lt;/li&gt;&lt;li&gt;語法簡明一致&lt;/li&gt;&lt;li&gt;記憶體自動管理&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&lt;em&gt;個體導向編程:&lt;/em&gt;&lt;/p&gt; &lt;ul&gt;&lt;li&gt;每個事物都是個體&lt;/li&gt;&lt;li&gt;類別、方法、繼承等等&lt;/li&gt;&lt;li&gt;singleton methods&lt;/li&gt;&lt;li&gt;以模組實現 "混成 (mixin)" 功能&lt;/li&gt;&lt;li&gt;迭代與程式區塊&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&lt;em&gt;還有:&lt;/em&gt;&lt;/p&gt; &lt;ul&gt;&lt;li&gt;複精度整數&lt;/li&gt;&lt;li&gt;便利的例外處理程序&lt;/li&gt;&lt;li&gt;動態載入&lt;/li&gt;&lt;li&gt;支援線程作業&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;如果你對上述概念感到陌生，別緊張，讀下去。 Ruby 語言之真言是 &lt;em&gt;快速與易用&lt;/em&gt;。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3131360903311377656-5335486126560257536?l=rock-say-ruby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rock-say-ruby.blogspot.com/feeds/5335486126560257536/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3131360903311377656&amp;postID=5335486126560257536' title='3 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3131360903311377656/posts/default/5335486126560257536'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3131360903311377656/posts/default/5335486126560257536'/><link rel='alternate' type='text/html' href='http://rock-say-ruby.blogspot.com/2007/02/ruby-users-guidewhat-is-ruby.html' title='Ruby User&apos;s Guide::What is ruby?'/><author><name>rock</name><uri>http://www.blogger.com/profile/04065431701479848049</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry></feed>
