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技術

          <2006年6月>
          28293031123
          45678910
          11121314151617
          18192021222324
          2526272829301
          2345678

          導航

          統計

          常用鏈接

          留言簿(3)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          相冊

          收藏夾

          Java技術網站

          友情鏈接

          國內一些開源網站

          最新隨筆

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 乡城县| 琼海市| 三台县| 许昌县| 丽江市| 水富县| 灵台县| 千阳县| 临高县| 临桂县| 吴川市| 新密市| 浙江省| 敖汉旗| 疏附县| 颍上县| 尼勒克县| 桃园县| 龙海市| 和田市| 阆中市| 灵石县| 临武县| 浑源县| 揭东县| 离岛区| 长治县| 扶余县| 延津县| 永丰县| 牟定县| 雅江县| 昌都县| 宁夏| 吴忠市| 浑源县| 交口县| 乌苏市| 邛崃市| 封开县| 顺昌县|