Ruby程序設計語言快速入門之變量與賦值

發表于:2007-04-26來源:作者:點擊數: 標簽:ruby程序設計快速變量入門
變量與賦值 至此,你是否注意到前面所有的示例代碼中都缺少某種東西?難道你必須輸入常數,實例變量或類變量?絕對不是!這正是 Ruby 的真正 面向對象 的天性的一部分。為此,首先讓我們看一下Ruby中以前的普通變量。至此,你已經創建了很多Rectangle實例,
  變量與賦值

  至此,你是否注意到前面所有的示例代碼中都缺少某種東西?難道你必須輸入常數,實例變量或類變量?絕對不是!這正是Ruby的真正面向對象的天性的一部分。為此,首先讓我們看一下Ruby中以前的普通變量。至此,你已經創建了很多Rectangle實例,但是你并沒有把它們保留多長時間。比方說,你想要把一個變量賦值給你創建的一個Rectangle實例:

clearcase/" target="_blank" >cccccc width="90%" align=center bgColor=#e3e3e3 border=1>
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 MyClass myMethod
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>

原文轉自:http://www.anti-gravitydesign.com

...
国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97