Ruby 使用手冊

方法 Methods

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

在 Ruby 中,我們利用點符號 (.) 呼叫物件的方法(與 C++ 或 Java 相同)。接收的物件位於點符號左側。

ruby> "abcdef".length
   6

直觀上,這個字串物件被詢問了字串的長度。技術上而言,我們呼叫了該物件 "abcdef"length 方法。

其他物件可能在解釋 length 上有些微差別,或者完全一樣。要在程式執行中,才會決定如何應對訊息,而採取甚麼動作則取決於變數所指的是甚麼物件。

ruby> foo = "abc"
   "abc"
ruby> foo.length
   3
ruby> foo = ["abcde", "fghij"]
   ["abcde", "fghij"]
ruby> foo.length
   2

長度 (length) 的意義取決於所討論的物件。上述範例中,我們第一次詢問 foo 的長度時,所指的是字串,而這只有一個合理的答案。第二次時,foo 指的是陣列,我們就可能合理地想到長度可能是 2、5 或 10,但最適當的答案當然是 2(如果希望的話,也可以想出其他種類的長度)。

ruby> foo[0].length
   5
ruby> foo[0].length + foo[1].length
   10

要注意的是,陣列知道身為陣列的責任。Ruby 的資料都明白自己的責任,所以收到要求後,他們都會以適當的方式完成工作。這可減輕程式員的工作,無需記住一大堆函數名稱,只要記住較少量的方法名稱即可,這與我們知道如何用自然語言表達的概念相同,並可應用於不同種類的資料,同樣能得到預期的結果。物件導向程式設計語言的這項特色(我個人認為 Java 在這方面並不出色)稱為多型 (polymorphism)

如果物件收到不能理解的訊息,錯誤就會「丟出」(raise):

ruby> foo = 5
   5
ruby> foo.length
ERR: (eval):1: undefined method `length' for 5(Fixnum)

雖然我們不需要知道方法如何運作,但必須清楚物件能夠接受那些方法。

若方法具有引數,引數通常用括號括起,

object.method(arg1, arg2)

但如果並不會造成歧義的話,也可以省略。

object.method arg1, arg2

Ruby 有個特別的變數稱為 self,指向現在的物件(也就是呼叫此方法的物件)。因為經常使用 "self.",所以在物件本身呼叫方法時,可以省略:

self.method_name(args...)

即等同於

method_name(args...)

我們可以把傳統的函數呼叫 (function call) 當做是物件 method,只是省略了 self 呼叫。因此 Ruby 可稱為純物件導向語言(編註:因為所有函式都在物件之中)。當然,這個函數呼叫與其他程式語言的函數非常類似,這也方便了那些不明白 Ruby 中函數呼叫就是物件方法的人。如果必要的話,我們會說 "函數 (functions)",以跟物件方法(object methods)做區別。

Copyright (c) 2005-2008 Mark Slagell,中文翻譯 Ruby Taiwan 社群

Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.

A copy of the license is included in the section entitled "GNU Free Documentation License."