rudy 方法 分析

什麼叫做一個方法呢?在OO編程里,我們不希望直接從外部操縱一個對象的數據;相反的,對象自己了解如何操縱自身(當被恰當地要求時). 
你也許會說我們傳遞一條消息給一個對象,那些消息就會調用某類行為或者做有意義的回復.這些都會在我們無需了解或關心這個對象內部 
工作機制的情況下發生.為我們所允許的可讓其執行的作業(或等價的,它能聽懂的消息)就是對象的方法. 

在ruby里,我們通過點(dot notation,正如C++或Java)來調用一個對象的方法.被調用的對象在點的左方給出. 

ruby> "abcdef".length 


表面上看,這一字元串被問及其長度.技術上看,我們正調用對象"abcdef"的length方法. 

其它的對象也許擁有一個稍有不同的length介面,或者根本沒有.消息的如何應答在程序運行期間做決定,行為也取決於其所指變數. 

ruby> foo = "abc" 
"abc" 
ruby> foo.length 

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


length的意義也會隨對象的變化而改變.在上例中,第一次我們叫foo返回其長度,它對應於一個簡單字元串,這裡也就只有一種合理的答案.第二次,foo代表一個數組,我們也許會考慮其長度為2,5或10;但一般情況下最合適的答案當然是2(其它類型長度也應被很容易的猜出). 

ruby> foo[0].length 

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

這裡需注意的是一個數組了解其自身作為一個數組的意義.Ruby中的一部分代碼賦予了他們這一性質,因此對他們的需求可以自動的通過各種 
適當的方法實現.由於相當少量的對應於我們在自然語言中所表達概念的方法名能被不同種類的數據如我們所願地採用,這便將程序員從大量特殊函數名中解脫出來.OO編程語言的這一特點(在我看來,Java的這一點做的並不是很好)叫做多態(polymorphism). 

當一個對象碰到一個不能理解的信息,一個錯誤便會"發生": 

ruby> foo = 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...) 

我們傳統意義上的函數調用只不過是self方式調用的一種簡寫罷了.這也使Ruby可以叫作一種純正的面向對象語言.當然,為了那些搞不清在Ruby里函數調用其實就是對象方法的人,函數化的方法看起來很像在別的語言中的函數.如果我們喜歡,我們也可以叫它們函數,就彷彿他們不是真的對象方法一樣.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值