Preface
在 Ruby 中,都是透過物件(Object)來處理資料,字串是物件,陣列是物件,即使整數也是物件。例如,你可以叫整數作些事情,像是作四次重複的動作:
在其它支援物件導向的程式語言中,會說這執行了 4 這個物件上的 times 方法(Method),不過 Ruby 的說法是,點運算子將 times 訊息(Message)傳送給 4 這個物件,4 這個物件執行了對應的 times 方法,4 稱為訊息 times 的接受者(Receiver)。類似地:
在 Ruby 中,物件可以理解某些訊息集合,並將之對應至可執行的方法,上例中,點運算子右邊的 upcase 訊息,會傳送給點運算子左邊的 "abc" 字串(String)物件,而 "abc" 字串物件執行了對應的 upcase 方法,"abc" 稱為 upcase 訊息的接受者。
淺談物件、訊息與方法
每個物件都是某個類別(Class)的實例(Instance),可以執行 class 方法,得知物件是哪個類別的實例:
從上例可以得知,整數 1 是 Fixnum 類別的實例,"abc" 字串是 String 類別的實例,關於類別的說明,之後還會詳介。物件會有可執行的方法,可以透過 methods 方法得知有哪些物件有哪些公開方法可以使用:
舉個例子來說,以下建立一個 Object 實例,並在其上定義了 some 方法:
在第二次執行 obj.methods 時,可以看到 obj 上新增了 some 方法。執行 obj.some 時, some 訊息傳送給 obj 參考的實例,obj 執行了 some 方法。
每個物件建立時,都會有一些基本方法,在這邊先介紹 respond_to? 與 send 方法。respond_to? 可以用來詢問物件,是否能對指定訊息作出回應(Ruby 慣例中,?結束的方法表示傳回 true 或 false 的結果),send 方法則可以將指定訊息傳送給物件。例如:
如果物件可以回應訊息,接收到訊息後,就可以執行對應方法,因此上例中,obj.some 與 obj.send "some",都是執行 obj 上的 some 方法作為回應。
以下是個使用 respond_to? 與 send 的實際例子:
- main.rb
- obj = Object.new
- def obj.some
- print "do some actions"
- end
- def obj.other
- print "do other actions"
- end
- if obj.respond_to? ARGV[0]
- obj.send ARGV[0]
- end
先前談過,print、puts 也是方法,執行 print、puts 沒有撰寫接收者,並不是這些方法不需要接受者,只是省略沒寫而已,如果省略訊息的接收者,訊息接收者就是 self,不同環境下,self 會參考至不同物件,這是個值得討論的進階議題,之後會再說明。
沒有留言:
張貼留言