什么是一個(gè)存取器?
我們?cè)谇懊嬉呀?jīng)討論過(guò)實(shí)變量了,但卻未過(guò)多的討論.一個(gè)對(duì)象的實(shí)變量屬于它的屬性,也是它與其它來(lái)自同一個(gè)類的對(duì)象的一般區(qū)別.讀寫它的屬性是重要的;這樣做需要做一個(gè)叫著屬性存取器(attributeaccessors)的方法.我們將很快看到我們并不是總要明確地寫出存取器方法,但現(xiàn)在先讓我們了解所有的細(xì)節(jié).存取器的兩種類型是寫(writer)和讀(reader).
ruby>classFruit
|defset_kind(k)#awriter
|@kind=k
|end
|defget_kind#areader
|@kind
|end
|end
nil
ruby>f1=Fruit.new
#
ruby>f1.set_kind("peach")#usethewriter
"peach"
ruby>f1.get_kind#usethereader
"peach"
ruby>f1#inspecttheobject
#
足夠簡(jiǎn)單;我們可以存取關(guān)于我們搜索的水果種類的信息.但我們的方法名還有點(diǎn)兒牢騷.下面的這個(gè)更簡(jiǎn)潔,也更方便.
ruby>classFruit
|defkind=(k)
|@kind=k
|end
|defkind
|@kind
|end
|end
nil
ruby>f2=Fruit.new
#
ruby>f2.kind="banana"
"banana"
ruby>f2.kind
"banana"
inspect方法
一個(gè)小插曲.你已注意到當(dāng)我們?cè)囍苯佑^察一個(gè)對(duì)象,就會(huì)出現(xiàn)一些像#
ruby>classFruit
|definspect
|"afruitofthe"+@kind+"variety"
|end
|end
nil
ruby>f2
"afruitofthebananavariety"
一個(gè)相關(guān)的方法是to_s(轉(zhuǎn)化為字符串),用在打印對(duì)象的時(shí)候.一般的,你可以認(rèn)為inspect是一個(gè)編寫或調(diào)試程序時(shí)用的工具,而to_s是一個(gè)美化程序輸出的方法.eval.rb顯示結(jié)果時(shí)總采用inspect.你可以用p方法簡(jiǎn)單的從程序里取得調(diào)試信息.
#Thesetwolinesareequivalent:
panObject
printanObject.inspect,"\n"
生成存取器的簡(jiǎn)單方法
因?yàn)樵S多實(shí)變量需要存取方法,Ruby提供了對(duì)應(yīng)于標(biāo)準(zhǔn)方法的縮寫.
Shortcut縮寫Effect等同于
attr_reader:vdefv;@v;end
attr_writer:vdefv=(value);@v=value;end
attr_accessor:vattr_reader:v;attr_writer:v
attr_accessor:v,:wattr_accessor:v;attr_accessor:w
讓我們利用它加上"新鮮"信息.首先,我們自動(dòng)生成了讀和寫方法,然后我們合并這一新信息到inspect中去:
ruby>classFruit
|attr_accessor:condition
|definspect
|"a"+@condition+@kind"
|end
|end
nil
ruby>f2.condition="ripe"
"ripe"
ruby>f2
"aripebanana"
更有趣的水果
如果沒(méi)人吃我們成熟的水果,也許我們?cè)撟屗鼈儬€掉.
ruby>classFruit
|deftime_passes
|@condition="rotting"
|end
|end
nil
ruby>f2
"aripebanana"
ruby>f2.time_passes
"rotting"
ruby>f2
"arottingbanana"
但當(dāng)我們這樣做時(shí),卻引入了一個(gè)小問(wèn)題.現(xiàn)在,如果我們?cè)賱?chuàng)造第三個(gè)水果會(huì)發(fā)生什么?記住:實(shí)變量不會(huì)在賦值前存在.
ruby>f3=Fruit.new
ERR:failedtoconvertnilintoString
是inspect方法在這里挺有理由地抱怨.我們已讓它報(bào)告水果的品種和狀態(tài),但f3還未賦過(guò)任何值.如果我們?cè)敢?我們可以重寫inspect方法使之用define?方法測(cè)試實(shí)變量并只在它們存在時(shí)才報(bào)告,但也許那不是很有用;因?yàn)槊恳粋€(gè)水果都有類型和狀態(tài).看來(lái)我們應(yīng)該在某種程度上確定其屬性.這正是下一節(jié)我們要討論的.