閑云無衣
          無衣的筆記
          前面一節的?Fruit?類有兩個實變量,分別表述水果的類型和狀態.直到為這個類寫了一個定制的inspect方法,我們方才了解它不會對一個缺乏屬性的水果做出合理的解釋.幸運的是,Ruby提供了一種允許實變量總是被初始化的方法.


          initalize方法

          當Ruby創建一個新對象時,它總是會尋找一個名為?initialize?的方法并執行它.因此,我們可以簡單通過一個initialize方法向實變量中加入缺省值,這樣一來,?inspect方法就有東西可說了.

          ruby>?class?Fruit
          ????|???def?initialize
          ????|?????@kind?=?"apple"
          ????|?????@condition?=?"ripe"
          ????|???end
          ????|?end
          ???nil
          ruby>?f4?=?Fruit.new
          ???"a?ripe?apple"?


          將缺省的變為需要的

          很多時候,缺省值不會有太多的意思.真的是缺省那樣的水果嗎?也許在創造水果的時候對其類型作要求是個更好的辦法.要這樣做,我們就必須給initialize?方法加入一個正式的參數.因為一些不會在此提及的原因,你向?new?傳遞的參數實際上是遞給了initialize.

          ruby>?class?Fruit
          ????|???def?initialize(?k?)
          ????|?????@kind?=?k
          ????|?????@condition?=?"ripe"
          ????|???end
          ????|?end
          ???nil
          ruby>?f5?=?Fruit.new?"mango"
          ???"a?ripe?mango"
          ruby>?f6?=?Fruit.new
          ERR:?(eval):1:in?`initialize':?wrong?#?of?arguments(0?for?1)?


          彈性的初始化

          上面我們看到一旦一個參數被關聯到一個?initialize?方法上,就無法在避免錯誤產生的情況下將其省掉.如果希望考慮周全,我們可以在給了參數的情況下使用它,否則使用缺省值.

          ruby>?class?Fruit
          ????|???def?initialize(?k="apple"?)
          ????|?????@kind?=?k
          ????|?????@condition?=?"ripe"
          ????|???end
          ????|?end
          ???nil
          ruby>?f5?=?Fruit.new?"mango"
          ???"a?ripe?mango"
          ruby>?f6?=?Fruit.new
          ???"a?ripe?apple"?


          可以在任何方法內使用缺省參數,而不僅僅是initialize.參數表(argument?list)必須以有缺省值的參數結尾.

          有時,提供多種初始化對象方法是有益的.雖然已超出本教程的范圍,但Ruby提供了對象映象(object?reflection)和可變長度的參數表(variable-length?argument?lists),這些都有效地促進了方法重載.
          posted on 2007-02-08 16:58 無衣 閱讀(248) 評論(0)  編輯  收藏 所屬分類: rails
           
          主站蜘蛛池模板: 安陆市| 炉霍县| 蓬莱市| 兴海县| 万源市| 台州市| 洪湖市| 丰县| 当涂县| 威信县| 乌拉特前旗| 都匀市| 靖远县| 宜阳县| 梁山县| 东安县| 泌阳县| 舞钢市| 巴彦淖尔市| 芜湖县| 五寨县| 屯门区| 左贡县| 明光市| 津南区| 洪江市| 青冈县| 博湖县| 南乐县| 康马县| 白山市| 普格县| 山东| 德州市| 庆城县| 句容市| 古田县| 宁国市| 庆安县| 抚顺市| 临沭县|