ruby 存取器 概念

ruby 存取器 概念

什麼是一個存取器? 


我們在前面已經討論過實變數了,但卻未過多的討論.一個對象的實變數屬於它的屬性,也是它與其它來自同一個類的對象的一般區別.讀寫它的屬性是重要的;這樣做需要做一個叫著屬性存取器(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? 方法測試實變數並只在它們存在時才報告,但也許那不是很有用;因為每一個水果都有類型和狀態.看來我們應該在某種程度上確定其屬性.這正是下一節我們要討論的.  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值