Ruby程序設計語言快速入門(三)---之變量與賦值
變量與賦值至此,你是否注意到前面所有的示例代碼中都缺少某種東西?難道你必須輸入常數,實例變量或類變量?絕對不是!這正是Ruby的真正面向對象的天性的一部分。為此,首先讓我們看一下Ruby中以前的普通變量。至此,你已經創建了很多Rectangle實例,但是你并沒有把它們保留多長時間。比方說,你想要把一個變量賦值給你創建的一個Rectangle實例:
myRectangle?=?Rectangle.new(4,5) |
在Ruby中這是完全有效的代碼,而且根本不需要另一行代碼來把myRectangle類型化或聲明為引用Rectangle的某種東西。在執行這一行代碼以后,變量myRectangle就引用一個Rectangle的實例(高度和寬度值分別為4,5)。但是,這僅是一種在任何時刻都可以更改的對象引用,而與對象的類型無關(在Ruby中一切都是對象)。因此,下面的命令提示符行中,你可以容易地把myRectangle賦值給一個字符串:
irb(main):049:0< myRectangle=Rectangle.new(4,5)
=> #<Rectangle:0x587c758 @width=5, @height=4>
irb(main):050:0< myRectangle="Jim's Rectangle"
=> "Jim's Rectangle"
你可以在許多其它程序語言(甚至包括象Java這樣的面向對象的語言)中試驗一下,并觀察從你的IDE所產生的編譯錯誤。
變量,實例變量,類變量,甚至還有"常量"其實都只是對象引用。它們引用對象,但是它們并不是對象本身。因此,它們可以被動態地改變,甚至引用另一種不同類型的對象。
因為這一靈活性,所以必須在Ruby中進行一些約定以幫助每個人都知道某個變量正為代碼所使用。其實,你已經看到了其中之一(@符號,它意味著這是一個實例變量)。其它的變量,方法和類命名約定列于下表1中。
- · 局部變量和方法參數以一個小寫字母開頭。
- · 方法名字以一個小寫字母開頭。
- · 全局變量以一個$開頭。
- · 實例變量以一個@開頭。
- · 類變量以兩個@開頭。
- · 常數以一個大寫字母開頭(它們經常被指定全部大寫)。
- · 類和模塊名以一個大寫字母開頭。
?局部變量 | ?全局變量 | ?實例變量 | ?類變量 | ?常數 | ?類名 | ?方法名 |
?aVar | ?$Var | ?@var | ?@@var | ?VAR | ?MyClassmy | ?Method |
?name | ?$debug | ?@lastName | ?@@interest | ?PI | ?Rectangle | ?area |
表1.這個表包含了在Ruby編碼約定下的相關示例。
操作符方法
現在,假定你想實現合并Rectangle類的實例或把它們添加到另一個Rectangle實例。你當然可以定義另外一個稱為"add"的方法,這種選擇利用了Ruby真正的面向對象的特征之一。然而,你還可以重載"+"運算符來適當地把兩個Rectangle實例加起來。這個"+"方法(如4+5),對Ruby來說,只是另外一個方法而已。由于只是"另外一個方法",所以你可以給它增加一些功能來滿足Rectangle類的需要。例如,你還可以定義"+"運算符來實現一個矩形面積加上另一個矩形面積。
def + (anotherRectangle) totalArea = area() + anotherRectangle.area() Rectangle.new(@height,totalArea/@height) end |
在把這個方法添加到Rectangle類以后,你可以使用+方法調用來把兩個Rectangle的實例相加:
irb(main):001:0> rect1=Rectangle.new(2,3) => #<Rectangle:0x58aa688 @width=3, @height=2> irb(main):002:0> rect2=Rectangle.new(3,4) => #<Rectangle:0x58a6ef0 @width=4, @height=3> irb(main):003:0> rect1+rect2 => #<Rectangle:0x58a4a60 @width=9, @height=2> |
這正是操作符重載,對于那些使用過Agol,C++,Python和其它語言的用戶來說,可能已經非常熟悉這個特征。
方法參數
至此,我們一直假定,傳遞給一個方法的參數個數是已知的。也許在其它語言中不可思議,但是Ruby的確允許你傳遞可變個數的參數并且以單個參數來捕獲它們。為了創建一個可變長度的參數,只需要把一個星號(*)放在最后一個參數前面即可。這樣,你就可以在Ruby中編寫一個如下的多邊形定義。
class Polygon def initialize (s1,s2,s3,*others) @sideOne = s1 @sideTwo = s2 @sideThree = s3 @otherSides = others end end |
如下所示,你可以使用這個定義來創建一個三角形或一個六邊形。
irb(main):009:0> poly1=Polygon.new(2,4,5) => #<Polygon:0x594db10 @otherSides=[], @sideThree=5, @sideTwo=4, @sideOne=2> irb(main):010:0> poly2=Polygon.new(2,18,4,5,7,9) => #<Polygon:0x5948d58 @otherSides=[5, 7, 9], @sideThree=4, @sideTwo=18, @sideOne=2> |
在支持可變長度參數的同時,Ruby還允許定義一個方法參數的默認值(在調用者沒有提供的情況下使用)。例如,下面是Rectangle類的一個更好的初始化表達。
def initialize (hgt = 1, wdth = 1) @height = hgt @width = wdth end |
現在,在調用時如果省略了某參數,那么在定義中參數緊鄰的賦值運算符擔當一個缺省的賦值器?,F在,當創建一新的矩形時,如果在調用時省略了寬度,那么一個適當的寬度也會被默認地提供:
irb(main):090:0> rect=Rectangle.new(2)
=> #<Rectangle:0x5873f68 @width=1, @height=2>
posted on 2006-06-19 11:58 nbt 閱讀(333) 評論(0) 編輯 收藏 所屬分類: Ruby On Railse技術