Skip to content
Browse files

Use 方法 instead of 函式 for method

  • Loading branch information...
1 parent 3705811 commit 06d78ea7e0235cf8f5a4f05acc89bc0c398b32d7 @ihower ihower committed Jul 30, 2010
View
16 documentation.quickstart-2.zh_TW.textile
@@ -1,4 +1,4 @@
-如果您想說很多次 "Hello",卻不想敲太多按鍵。是時候定義一個函式了!
+如果您想說很多次 "Hello",卻不想敲太多按鍵。是時候定義一個方法了!
<notextile><r:code>
irb(main):010:0> def h
@@ -7,11 +7,11 @@ irb(main):012:1> end
=> nil
</r:code></notextile>
-從 @def h@ 開始定義一個函式。它告訴 Ruby 函式名字是 @h@。下一行是函式的內容,也就是我們之前看過的 @puts "Hello World"@。接著最後一行 @end@ 表示函式定義結束。 Ruby 回應 @=> nil@ 告訴我們它知悉了這個函式定義
+從 @def h@ 開始定義一個方法。它告訴 Ruby 方法名字是 @h@。下一行是方法的內容,也就是我們之前看過的 @puts "Hello World"@。接著最後一行 @end@ 表示方法定義結束。 Ruby 回應 @=> nil@ 告訴我們它知悉了這個方法定義
-h2. 這個簡短可以反覆執行的函式
+h2. 這個簡短可以反覆執行的方法
-現在來試試看執行這個函式數次
+現在來試試看執行這個方法數次
<notextile><r:code>
irb(main):013:0> h
@@ -22,9 +22,9 @@ Hello World!
=> nil
</r:code></notextile>
-簡單吧。在 Ruby 中呼叫函式只要輸入函式名字就可以了。如果函式不需要參數,那麼括號可以省略。你也可以加上空括號,但不是必要的。
+簡單吧。在 Ruby 中呼叫方法只要輸入方法名字就可以了。如果方法不需要參數,那麼括號可以省略。你也可以加上空括號,但不是必要的。
-如果你只想對某個人打招呼呢? 只要重新定義 @h@ 函式接受一個參數即可
+如果你只想對某個人打招呼呢? 只要重新定義 @h@ 方法接受一個參數即可
<notextile><r:code>
irb(main):015:0> def h(name)
@@ -55,7 +55,7 @@ Hello World!
=> nil
</r:code></notextile>
-這裡還有幾個小訣竅。第一是我們再次省略了函式的括號。如果函式呼叫很簡單,那麼括號建議你可以省略掉。另一個訣竅是參數有預設值 @World@。意思是說 "如果沒有給 name 參數,那麼就使用預設值 @"World"@"。
+這裡還有幾個小訣竅。第一是我們再次省略了方法的括號。如果方法呼叫很簡單,那麼括號建議你可以省略掉。另一個訣竅是參數有預設值 @World@。意思是說 "如果沒有給 name 參數,那麼就使用預設值 @"World"@"。
h2. 發展成 Greeter (接待員)
@@ -76,7 +76,7 @@ irb(main):034:1> end
=> nil
</r:code></notextile>
-新的關鍵字是 @class@。這定義了一個新的類別叫做 Greeter,以及屬於這個類別的函式。注意到 @@name@ 這是一個實例變數,可以在類別裡面的函式中存取到。你可以看到在函式 @say_hi@ 和 @say_bye@ 裡使用了它。
+新的關鍵字是 @class@。這定義了一個新的類別叫做 Greeter,以及屬於這個類別的方法。注意到 @@name@ 這是一個實例變數,可以在類別裡面的方法中存取到。你可以看到在方法 @say_hi@ 和 @say_bye@ 裡使用了它。
如何讓 Greeter 類別動起來呢? 請接著看 "建立物件":../3/。
View
10 documentation.quickstart-3.zh_TW.textile
@@ -26,7 +26,7 @@ h2. 揭開物件的面紗
物件中的實例變數(Instance variables)是隱藏的。雖然可以透過檢查(inspect)物件看到這個變數,不過 Ruby 採用了物件導向的思維(譯註: 即封裝),內部屬性資料基本上是隱藏起來的。
-到底 Greeter 物件有哪些函式呢?
+到底 Greeter 物件有哪些方法呢?
<notextile><r:code>
irb(main):039:0> Greeter.instance_methods
@@ -42,14 +42,14 @@ irb(main):039:0> Greeter.instance_methods
"instance_variables", "instance_of?"]
</r:code></notextile>
-哇。有這麼多。我們不是只定義了兩個函式,怎麼回事呢? 這裡列出的是*所有* Greeter 物件的函式,因此也包括了它所繼承的類別的函式。如果我們只需要 Greeter 自己的函式,可以傳入一個 *false* 參數,表示我們不希望包括父類別的函式
+哇。有這麼多。我們不是只定義了兩個方法,怎麼回事呢? 這裡列出的是*所有* Greeter 物件的方法,因此也包括了它所繼承的類別的方法。如果我們只需要 Greeter 自己的方法,可以傳入一個 *false* 參數,表示我們不希望包括父類別的方法
<notextile><r:code>
irb(main):040:0> Greeter.instance_methods(false)
=> ["say_bye", "say_hi"]
</r:code></notextile>
-看起來好多了。讓我們看看 greeter 物件對哪些函式有反應?
+看起來好多了。讓我們看看 greeter 物件對哪些方法有反應?
<notextile><r:code>
irb(main):041:0> g.respond_to?("name")
@@ -60,7 +60,7 @@ irb(main):043:0> g.respond_to?("to_s")
=> true
</r:code></notextile>
-它知道 @say_hi@ 和 @to_s@ (意思是轉換成字串,這是每個物件都有的函式),但是不知道 @name@ 這個函式
+它知道 @say_hi@ 和 @to_s@ (意思是轉換成字串,這是每個物件都有的方法),但是不知道 @name@ 這個方法
h2. 變更類別,永不嫌晚
@@ -96,7 +96,7 @@ Hi Betty!
=> nil
</r:code></notextile>
-@attr_accessor@ 會定義兩個新的函式,@name@ 用來取值,而 @name=@ 用來給值。
+@attr_accessor@ 會定義兩個新的方法,@name@ 用來取值,而 @name=@ 用來給值。
h2. 可以歡迎任何東西的 MegaGreeter!
View
14 documentation.quickstart-4.zh_TW.textile
@@ -1,6 +1,6 @@
我們來深入看看這個新程式。注意到由井號(#)開頭的第一行,在 Ruby 裡,任何在井號之後的內容都是註解,會被直譯器忽略。除了檔案的第一行是個例外,在 Unix-like 作業系統下這告訴 Shell 如何執行這個檔案。其餘的註解則用來說明程式。
-我們的 @say_hi@ 函式也改變了
+我們的 @say_hi@ 方法也改變了
<notextile><r:code>
# 對每個人說 hi
@@ -22,7 +22,7 @@ end
h2. 循環、迴圈,迭代 (Iteration)
-如果 @@names@ 物件可以回應 @each@ 函式,那表示你可以迭代它,好讓我們輪流對其中的元素打招呼。如果 @@names@ 什麼都不是,我們透過字串內嵌把它轉化成字串,用預設的打招呼方式。
+如果 @@names@ 物件可以回應 @each@ 方法,那表示你可以迭代它,好讓我們輪流對其中的元素打招呼。如果 @@names@ 什麼都不是,我們透過字串內嵌把它轉化成字串,用預設的打招呼方式。
下面來看一看這是怎麼迭代的:
@@ -32,7 +32,7 @@ h2. 循環、迴圈,迭代 (Iteration)
end
</r:code></notextile>
-@each@ 是一個可以接受程式區塊(a block of code)的函式,它會對 @@names@ 裡的每個元素執行這個程式區塊,也就是從 @do@ 到 @end@ 的程式碼。一個程式區塊就像是一個匿名函式,也像是 @lambda@。而在直線 @|@ 符號之間的是這個程式區塊的參數。
+@each@ 是一個可以接受程式區塊(a block of code)的方法,它會對 @@names@ 裡的每個元素執行這個程式區塊,也就是從 @do@ 到 @end@ 的程式碼。一個程式區塊就像是一個匿名方法,也像是 @lambda@。而在直線 @|@ 符號之間的是這個程式區塊的參數。
具體來說就是,程式區塊裡的 @name@ 參數會被輪流指定為容器裡的每個元素,然後執行 @puts "Hello #{name}!"@ 。
@@ -45,11 +45,11 @@ for (i=0; i<number_of_elements; i++)
}
</r:code></notextile>
-這樣也行,只是沒這麼漂亮。你需要一個用過即丟的 @i@ 變數、需要計算容器的長度、檢查離開迴圈的條件。而 Ruby 的方式漂亮多了,所有的工作都被包裝在 @each@ 函式裡。在 @each@ 內部會去輪流呼叫 @yield "Albert"@、@yield "Brenda"@、@yield "Charles"@ 等等。(譯註:yield 的意思是"轉交",也就是跳去執行程式區塊)
+這樣也行,只是沒這麼漂亮。你需要一個用過即丟的 @i@ 變數、需要計算容器的長度、檢查離開迴圈的條件。而 Ruby 的方式漂亮多了,所有的工作都被包裝在 @each@ 方法裡。在 @each@ 內部會去輪流呼叫 @yield "Albert"@、@yield "Brenda"@、@yield "Charles"@ 等等。(譯註:yield 的意思是"轉交",也就是跳去執行程式區塊)
h2. 讓 Ruby 發光發亮的程式區塊(Blocks)
-程式區塊真正厲害的地方是,它可以處理比迭代更複雜的任務。你可以用來設定(setup)、卸載(teardown)和錯誤處理,這些都可以隱藏起來讓函式使用者無需擔心
+程式區塊真正厲害的地方是,它可以處理比迭代更複雜的任務。你可以用來設定(setup)、卸載(teardown)和錯誤處理,這些都可以隱藏起來讓方法使用者無需擔心
<notextile><r:code>
# 向每個人說 bye
@@ -65,7 +65,7 @@ def say_bye
end
</r:code></notextile>
-@say_bye@ 函式沒有用到 @each@,而是檢查 @@names@@ 是不是可以回應 @join@ 函式。如果可以,就呼叫它。不然它就把它當做字串輸出。這個函式並不在乎變數真正的 _型別(type)_,而只關心變數是不是可以回應支援某個函式,這種風格叫做 "鴨子型別(Duck Typing)",意義就是 "如果它走起來像鴨子,叫起來也像鴨子,那就當它是鴨子"。這種思維的好處是它不會被變數的型別所限制。如果有人寫了新的容器類別,並且也實作了 @join@ 這個函式,那麼我們就可以在這裡使用它。
+@say_bye@ 方法沒有用到 @each@,而是檢查 @@names@@ 是不是可以回應 @join@ 方法。如果可以,就呼叫它。不然它就把它當做字串輸出。這個方法並不在乎變數真正的 _型別(type)_,而只關心變數是不是可以回應支援某個方法,這種風格叫做 "鴨子型別(Duck Typing)",意義就是 "如果它走起來像鴨子,叫起來也像鴨子,那就當它是鴨子"。這種思維的好處是它不會被變數的型別所限制。如果有人寫了新的容器類別,並且也實作了 @join@ 這個方法,那麼我們就可以在這裡使用它。
h2. 讓腳本跑起來
@@ -75,7 +75,7 @@ h2. 讓腳本跑起來
if __FILE__ == $0
</r:code></notextile>
-@__FILE__@ 是一個預先定義好的變數,內容是目前這個檔案的名稱。而 @$0@ 是執行這隻程式的執行檔名稱。這個檢查是說 "如果這個檔案就是執行程式的檔案...."。這可以允許將這個檔案當做函式庫使用。也就是說,這個檔案如果當做函式庫使用時,不會執行這段程式。如果當做執行檔執行,就會執行這段程式。
+@__FILE__@ 是一個預先定義好的變數,內容是目前這個檔案的名稱。而 @$0@ 是執行這隻程式的執行檔名稱。這個檢查是說 "如果這個檔案就是執行程式的檔案...."。這可以允許將這個檔案當做方法庫使用。也就是說,這個檔案如果當做方法庫使用時,不會執行這段程式。如果當做執行檔執行,就會執行這段程式。
h2. 就這樣啦
View
6 documentation.quickstart.zh_TW.textile
@@ -71,11 +71,11 @@ irb(main):006:0> Math.sqrt(9)
h2. 給程式分類的模組(Modules)
-@Math@ 是一個內建的數學模組。Ruby 的模組有兩種作用。這裡介紹的是第一種:把功能相似的函式放在一起。@Math@ 模組還包括了像是 @sin()@ 和 @tan()@。
+@Math@ 是一個內建的數學模組。Ruby 的模組有兩種作用。這裡介紹的是第一種:把功能相似的方法放在一起。@Math@ 模組還包括了像是 @sin()@ 和 @tan()@。
-接下來介紹點(dot)。這個點是做什麼用的? 這個點是用來告訴接收者(即 Math 模組)一個訊息。什麼訊息呢? 在這個例子,訊息是 @sqrt(9)@,也就是呼叫 @sqet@ 函式,並傳遞 9 作為參數。sqrt 正是 "square root" 平方根的意思。
+接下來介紹點(dot)。這個點是做什麼用的? 這個點是用來告訴接收者(即 Math 模組)一個訊息。什麼訊息呢? 在這個例子,訊息是 @sqrt(9)@,也就是呼叫 @sqet@ 方法,並傳遞 9 作為參數。sqrt 正是 "square root" 平方根的意思。
-這個函式的回傳值是 @3.0@。你可能會發現到這不只是 @3@ 而已,還包括小數點。這是因為大多數的情況開根號不會剛好是整數,所以這個函數總是回傳浮點數。
+這個方法的回傳值是 @3.0@。你可能會發現到這不只是 @3@ 而已,還包括小數點。這是因為大多數的情況開根號不會剛好是整數,所以這個函數總是回傳浮點數。
如果我們想記住運算的結果呢? 指定到一個變數即可。
View
48 documentation.ruby-from-other-languages.zh_TW.textile
@@ -52,7 +52,7 @@ irb(main):002:0> "george".object_id == "george".object_id
irb(main):003:0>
</r:code></notextile>
-<code>object_id</code> 函式會回傳物件的識別編號。如果有兩個物件有相同的 <code>object_id</code> 表示它們其實是同一個(指向同一個記憶體位置)。
+<code>object_id</code> 方法會回傳物件的識別編號。如果有兩個物件有相同的 <code>object_id</code> 表示它們其實是同一個(指向同一個記憶體位置)。
如你所見,使用過 Symbols 之後,任何相同名字的 Symbol 都是指記憶體裡的同一個物件。對任何相同名字的 Symbols,它們的 <code>object_id</code> 都一樣。
@@ -84,7 +84,7 @@ h3. 命名慣例
Ruby 規定了一些命名慣例。變數的識別名稱,大寫字母開頭的是常數、錢號($)開頭的是全域變數、<code>@</code> 開頭是實例變數(instance variable)、<code>@@</code> 開頭則是類別變數。
-函式名稱可以允許大寫字母開頭,雖然可能造成一些混淆,例如:
+方法名稱可以允許大寫字母開頭,雖然可能造成一些混淆,例如:
<notextile><r:code>
Constant = 10
@@ -97,7 +97,7 @@ end
h3. 虛擬關鍵字參數
-Ruby 不像 Python 有關鍵字參數(keyword parameters)功能,但是可以用 symbols 和雜湊(hash) 來替代。Ruby on Rails 和非常多的函式庫都使用了這個方法,例如:
+Ruby 不像 Python 有關鍵字參數(keyword parameters)功能,但是可以用 symbols 和雜湊(hash) 來替代。Ruby on Rails 和非常多的方法庫都使用了這個方法,例如:
<notextile><r:code>
def some_keyword_params( params )
@@ -144,7 +144,7 @@ class MyClass
end
</r:code></notextile>
-你可能會認為 <code>another_method</code> 是 public 的,但不是這樣。這個 'private' 存取修飾到作用域(scope)結束,或是直到另一個存取修飾詞開始作用。函式預設都是 public 的:
+你可能會認為 <code>another_method</code> 是 public 的,但不是這樣。這個 'private' 存取修飾到作用域(scope)結束,或是直到另一個存取修飾詞開始作用。方法預設都是 public 的:
<notextile><r:code>
class MyClass
@@ -158,15 +158,15 @@ class MyClass
end
</r:code></notextile>
-<code>public</code>, <code>private</code> 和 <code>protected</code> 其實也是一種函式,所以可以接受參數。如果你傳入一個 Symbol,那個該 Symbol 代表的函式就會改變存取權限
+<code>public</code>, <code>private</code> 和 <code>protected</code> 其實也是一種方法,所以可以接受參數。如果你傳入一個 Symbol,那個該 Symbol 代表的方法就會改變存取權限
-h3. 函式存取權限
+h3. 方法存取權限
-在 Java 裡,<code>public</code> 表示函式可以被任何人呼叫。<code>protected</code> 表示只有這個類別的實例、衍生類別的實例,以及相同 package 類別的實例可以呼叫,而 <code>private</code> 表示除了這個類別的實例之外,其他都不行呼叫。
+在 Java 裡,<code>public</code> 表示方法可以被任何人呼叫。<code>protected</code> 表示只有這個類別的實例、衍生類別的實例,以及相同 package 類別的實例可以呼叫,而 <code>private</code> 表示除了這個類別的實例之外,其他都不行呼叫。
在 Ruby 中,<code>public</code> 還是一樣是公開的意思,其他則有一點差異。<code>private</code> 表示只有不指定接受者(receiver)時才可以呼叫,也就是只有 *self* 可以當成 private 方法的接受者。
-<code>protected</code> 也有點不同。一個 protected 函式除了可以被一個類別或衍生類別的實例呼叫,也可以讓另一個相同類別的實例來當做接受者。
+<code>protected</code> 也有點不同。一個 protected 方法除了可以被一個類別或衍生類別的實例呼叫,也可以讓另一個相同類別的實例來當做接受者。
來看看 "Ruby FAQ":http://faq.rubygarden.org/entry/show/57?controller_prefix=faq%2F 的例子:
@@ -213,7 +213,7 @@ irb(main):026:0>
h3. 類別是開放的
-Ruby 的類別是開放的,你可以隨時打開它新增一點程式或是修改。即使是核心類別如 <code>Fixnum</code> 或是 <code>Object</code>(這是所有類別的父類別) 都一樣。 Ruby on Rails 甚至定義了一堆時間函式到 <code>Fixnum</code> 去,例如:
+Ruby 的類別是開放的,你可以隨時打開它新增一點程式或是修改。即使是核心類別如 <code>Fixnum</code> 或是 <code>Object</code>(這是所有類別的父類別) 都一樣。 Ruby on Rails 甚至定義了一堆時間方法到 <code>Fixnum</code> 去,例如:
<notextile><r:code>
class Fixnum
@@ -228,15 +228,15 @@ end
Time.mktime(2006, 01, 01) + 14.hours # => Sun Jan 01 14:00:00
</r:code></notextile>
-h3. 有趣的函式名稱
+h3. 有趣的方法名稱
-在 Ruby 裡,函式名稱允許用問號或驚嘆號結尾。慣例上,用來回答是非題的函式會用問號結尾 (例如 <tt>Array#empty?</tt> 會回傳 *true* 如果函式接收者是空的)。有潛在 "危險" (表示有某種副作用,會修改 *self* 或參數值。例如 <code>exit!</code> 等) 的函式會用驚嘆號結尾
+在 Ruby 裡,方法名稱允許用問號或驚嘆號結尾。慣例上,用來回答是非題的方法會用問號結尾 (例如 <tt>Array#empty?</tt> 會回傳 *true* 如果方法接收者是空的)。有潛在 "危險" (表示有某種副作用,會修改 *self* 或參數值。例如 <code>exit!</code> 等) 的方法會用驚嘆號結尾
-但是這不表示所有會修改參數的函式一定有驚嘆號結尾,例如 <tt>Array#replace</tt> 就會替換內容成別的陣列,畢竟 replace 的意思就是要修改替換自己。
+但是這不表示所有會修改參數的方法一定有驚嘆號結尾,例如 <tt>Array#replace</tt> 就會替換內容成別的陣列,畢竟 replace 的意思就是要修改替換自己。
-h3. 單件函式
+h3. 單件方法
-單件函式(Singleton methods)是個別物件才有的函式。它們只存在於你要定義的物件之中。
+單件方法(Singleton methods)是個別物件才有的方法。它們只存在於你要定義的物件之中。
<notextile><r:code>
class Car
@@ -259,12 +259,12 @@ other_car.inspect # => Cheap car
</r:code></notextile>
-h3. Missing 函式
+h3. Missing 方法
-當你呼叫一個不存在的函式,Ruby 仍然有辦法處理。它會改呼叫 <code>method_missing</code> 這個函式,並把這個不存在的函式名稱傳進去當做參數。method_missing 預設會丟出一個 NameError 例外,但是你可以根據你的需求重新定義過,也有許多函式庫這麼做。這是一個例子:
+當你呼叫一個不存在的方法,Ruby 仍然有辦法處理。它會改呼叫 <code>method_missing</code> 這個方法,並把這個不存在的方法名稱傳進去當做參數。method_missing 預設會丟出一個 NameError 例外,但是你可以根據你的需求重新定義過,也有許多方法庫這麼做。這是一個例子:
<notextile><r:code>
-# id 是被呼叫函式的名字,而 * 符號會收集
+# id 是被呼叫方法的名字,而 * 符號會收集
# 所有傳進來的參數變成一個叫做 'arguments' 的陣列
def method_missing( id, *arguments )
puts "Method #{id} was called, but not found. It has " +
@@ -280,7 +280,7 @@ __ :a, :b, 10
h3. 傳遞訊息,不是呼叫函數
-一個函式呼叫(method call)其實就是送一個 *訊息(message)* 給一個物件:
+一個方法呼叫(method call)其實就是送一個 *訊息(message)* 給一個物件:
<notextile><r:code>
# 這個
@@ -293,7 +293,7 @@ h3. 傳遞訊息,不是呼叫函數
h3. Blocks 也算是物件
-程式區塊 Blocks (或叫做 closures) 被廣泛應用在標準函式庫。要執行一個程式區塊,可以用 @yield@ ,或是透過一個特別的參數讓它變成 @Proc@,例如:
+程式區塊 Blocks (或叫做 closures) 被廣泛應用在標準方法庫。要執行一個程式區塊,可以用 @yield@ ,或是透過一個特別的參數讓它變成 @Proc@,例如:
<notextile><r:code>
def block( &the_block )
@@ -305,9 +305,9 @@ adder = block { |a, b| a + b }
adder.class # => Proc
</r:code></notextile>
-你也可以透過 Proc.new 或 lambda 在函式外建立程式區塊
+你也可以透過 Proc.new 或 lambda 在方法外建立程式區塊
-同樣的,函式也可以當做物件
+同樣的,方法也可以當做物件
<notextile><r:code>
method(:puts).call "puts is an object!"
@@ -316,7 +316,7 @@ method(:puts).call "puts is an object!"
h3. 操作符只是語法包裝
-大部分的 Ruby 操作符(operators)只是一種函式呼叫的語法包裝(syntactic sugar),加上一些優先權規則。你要的話,舉例來說,我們可以覆寫掉 Fixnum 的 + 函式
+大部分的 Ruby 操作符(operators)只是一種方法呼叫的語法包裝(syntactic sugar),加上一些優先權規則。你要的話,舉例來說,我們可以覆寫掉 Fixnum 的 + 方法
<notextile><r:code>
class Fixnum
@@ -329,9 +329,9 @@ end
你不需要 C++ 的 <code>operator+</code> 等等。
-甚至有如陣列存取的 <code>[]</code> 和 <code>[]=</code> 可以定義。要定義一元的 + and - (想想看 +1 跟 -2),你必須分別定義 <code>+@</code> 和 <code>-@</code> 函式
+甚至有如陣列存取的 <code>[]</code> 和 <code>[]=</code> 可以定義。要定義一元的 + and - (想想看 +1 跟 -2),你必須分別定義 <code>+@</code> 和 <code>-@</code> 方法
-以下的操作符則*不是*語法包裝。它們不是函式,不能被覆寫定義:
+以下的操作符則*不是*語法包裝。它們不是方法,不能被覆寫定義:
<notextile><r:code lang="symbols">
=, .., ..., !, not, &&, and, ||, or, !=, !~, ::

0 comments on commit 06d78ea

Please sign in to comment.
Something went wrong with that request. Please try again.