<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    閑云無衣
    無衣的筆記
    什么是一個存取器?

    一個對象的實例變量屬于它的屬性,也是它與其它來自同一個類的對象的一般區別。讀寫它的屬性是重要的;這樣做需要做一個叫著屬性存取器(attribute?accessors)的方法.我們將很快看到我們并不是總要明確地寫出存取器方法,但現在先讓我們了解所有的細節.存取器的兩種類型是寫(writer)和讀(reader).

    ruby>?class?Fruit
    ????|???def?set_kind(k)??#?a?writer
    ????|?????@kind?=?k
    ????|???end
    ????|???def?get_kind?????#?a?reader
    ????|?????@kind
    ????|???end
    ????|?end
    ???nil
    ruby>?f1?=?Fruit.new
    ???#<Fruit:0xfd7e7c8c>
    ruby>?f1.set_kind("peach")??#?use?the?writer
    ???"peach"
    ruby>?f1.get_kind???????????#?use?the?reader
    ???"peach"
    ruby>?f1????????????????????#?inspect?the?object
    ???#<Fruit:0xfd7e7c8c?@kind="peach">?


    足夠簡單;我們可以存取關于我們搜索的水果種類的信息.但我們的方法名還有點兒牢騷.下面的這個更簡潔,也更方便.

    ruby>?class?Fruit
    ????|???def?kind=(k)
    ????|?????@kind?=?k
    ????|???end
    ????|???def?kind
    ????|?????@kind
    ????|???end
    ????|?end
    ???nil
    ruby>?f2?=?Fruit.new
    ???#<Fruit:0xfd7e7c8c>
    ruby>?f2.kind?=?"banana"
    ???"banana"
    ruby>?f2.kind
    ???"banana"?


    inspect方法

    一個小插曲.你已注意到當我們試著直接觀察一個對象,就會出現一些像?#<anObject:?0x83678>?的東西.這只是個缺省的行為,我們可以自由地改變它.我們所要做的只是加一個名為?inspect?的方法.它會換一個更明了的描述對象的字符串,包括部分或全部的實變量.

    ruby>?class?Fruit
    ????|???def?inspect
    ????|?????"a?fruit?of?the?"?+?@kind?+?"?variety"
    ????|???end
    ????|?end
    ???nil
    ruby>?f2
    ???"a?fruit?of?the?banana?variety"?


    一個相關的方法是to_s(轉化為字符串),用在打印對象的時候.一般的,你可以認為?inspect?是一個編寫或調試程序時用的工具,而?to_s?是一個美化程序輸出的方法.eval.rb顯示結果時總采用?inspect.?你可以用?p?方法簡單的從程序里取得調試信息.

    #?These?two?lines?are?equivalent:
    p?anObject
    print?anObject.inspect,?"\n"?


    生成存取器的簡單方法

    因為許多實變量需要存取方法,?Ruby提供了對應于標準方法的縮寫.

    Shortcut縮寫??????????Effect等同于??
    attr_reader?:v????????def?v;?@v;?end??
    attr_writer?:v????????def?v=(value);?@v=value;?end??
    attr_accessor?:v??????attr_reader?:v;?attr_writer?:v??
    attr_accessor?:v,?:w??attr_accessor?:v;?attr_accessor?:w??

    讓我們利用它加上"新鮮"信息.首先,我們自動生成了讀和寫方法,然后我們合并這一新信息到?inspect?中去:

    ruby>?class?Fruit
    ????|???attr_accessor?:condition
    ????|???def?inspect
    ????|?????"a?"?+?@condition?+?@kind"
    ????|???end
    ????|?end
    ???nil
    ruby>?f2.condition?=?"ripe"
    ???"ripe"
    ruby>?f2
    ???"a?ripe?banana"?


    更有趣的水果

    如果沒人吃我們成熟的水果,也許我們該讓它們爛掉.

    ruby>?class?Fruit
    ????|???def?time_passes
    ????|?????@condition?=?"rotting"
    ????|???end
    ????|?end
    ???nil
    ruby>?f2
    ???"a?ripe?banana"
    ruby>?f2.time_passes
    ???"rotting"
    ruby>?f2
    ???"a?rotting?banana"?


    但當我們這樣做時,卻引入了一個小問題.現在,如果我們再創造第三個水果會發生什么?記住:實變量不會在賦值前存在.

    ruby>?f3?=?Fruit.new
    ERR:?failed?to?convert?nil?into?String?


    是?inspect?方法在這里挺有理由地抱怨.我們已讓它報告水果的品種和狀態,但?f3?還未賦過任何值.如果我們愿意,我們可以重寫inspect方法使之用?define??方法測試實變量并只在它們存在時才報告,但也許那不是很有用;因為每一個水果都有類型和狀態.看來我們應該在某種程度上確定其屬性.
    posted on 2007-02-08 16:55 無衣 閱讀(235) 評論(0)  編輯  收藏 所屬分類: rails
     
    主站蜘蛛池模板: 国产卡二卡三卡四卡免费网址| 一区二区视频免费观看| 亚洲av永久无码精品三区在线4| 亚洲人成网站在线播放影院在线 | 久久久精品国产亚洲成人满18免费网站| 国产亚洲精品免费| 偷自拍亚洲视频在线观看99| 色噜噜的亚洲男人的天堂| 日韩在线视精品在亚洲| 美女被吸屁股免费网站| 一区二区三区免费看| 久久久精品视频免费观看| 精品亚洲永久免费精品| 99蜜桃在线观看免费视频网站| 午夜免费啪视频在线观看 | 国产精品久久久久久亚洲影视| 亚洲国产成人精品无码区花野真一 | 3344永久在线观看视频免费首页| 最近免费中文在线视频| 国产福利视精品永久免费| 丁香花在线观看免费观看| 国产男女猛烈无遮挡免费视频网站 | 国产日韩一区二区三免费高清| 久久国产乱子伦精品免费一| 国产成人精品免费视频大| 成人au免费视频影院| 亚洲av再在线观看| 久久精品国产精品亚洲精品| 91在线精品亚洲一区二区| 久久国产亚洲精品| a级毛片免费观看网站| 午夜精品射精入后重之免费观看 | 成人网站免费大全日韩国产| 久久午夜伦鲁片免费无码| 国产在线a免费观看| 又黄又爽一线毛片免费观看 | 国产在线国偷精品产拍免费| 四虎1515hm免费国产| 亚洲av最新在线网址| 中文字幕无码亚洲欧洲日韩| 青青草97国产精品免费观看|