程式扎記: [ Ruby Gossip ] Basic : 變數、操作與物件 - 淺談物件、訊息與方法

標籤

2014年10月16日 星期四

[ Ruby Gossip ] Basic : 變數、操作與物件 - 淺談物件、訊息與方法

Source From Here 
Preface 
在 Ruby 中,都是透過物件(Object)來處理資料,字串是物件,陣列是物件,即使整數也是物件。例如,你可以叫整數作些事情,像是作四次重複的動作: 
 

在其它支援物件導向的程式語言中,會說這執行了 4 這個物件上的 times 方法(Method),不過 Ruby 的說法是,點運算子將 times 訊息(Message)傳送給 4 這個物件,4 這個物件執行了對應的 times 方法,4 稱為訊息 times 的接受者(Receiver)。類似地: 
>> "abc".upcase
=> "ABC"

在 Ruby 中,物件可以理解某些訊息集合,並將之對應至可執行的方法,上例中,點運算子右邊的 upcase 訊息,會傳送給點運算子左邊的 "abc" 字串(String)物件,而 "abc" 字串物件執行了對應的 upcase 方法,"abc" 稱為 upcase 訊息的接受者。 

淺談物件、訊息與方法 
每個物件都是某個類別(Class)的實例(Instance),可以執行 class 方法,得知物件是哪個類別的實例: 
>> 1.class
=> Fixnum
>> "abc".class
=> String

從上例可以得知,整數 1 是 Fixnum 類別的實例,"abc" 字串是 String 類別的實例,關於類別的說明,之後還會詳介。物件會有可執行的方法,可以透過 methods 方法得知有哪些物件有哪些公開方法可以使用: 
>> "abc".methods
=> [:<=>, :==, :===, :eql?, :hash, :casecmp, :+, :*, :%, :[], :[]=, :insert, :le
ngth, :size, ...略, :__s
end__]

舉個例子來說,以下建立一個 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 
  1. obj = Object.new  
  2.   
  3. def obj.some  
  4.     print "do some actions"  
  5. end  
  6.   
  7. def obj.other  
  8.     print "do other actions"  
  9. end  
  10.   
  11. if obj.respond_to? ARGV[0]  
  12.     obj.send ARGV[0]  
  13. end  
這個範例可以從命令列引數指定要執行物件上的哪個方法。例如: 
> ruby main.rb other
do other actions
> ruby main.rb some
do some actions

先前談過,print、puts 也是方法,執行 print、puts 沒有撰寫接收者,並不是這些方法不需要接受者,只是省略沒寫而已,如果省略訊息的接收者,訊息接收者就是 self,不同環境下,self 會參考至不同物件,這是個值得討論的進階議題,之後會再說明。

沒有留言:

張貼留言

網誌存檔

關於我自己

我的相片
Where there is a will, there is a way!