關(guān)于attr_accessor的理解

首先attr_accessor相當(dāng)于attr_reader和attr_writer的合體版,相當(dāng)于在class里面生成了setter和getter方法吧,使得ruby能夠使用 instance.value 的形式賦值和取值,更加方便吧

一開始沒能理解,于是測試了很多遍,也發(fā)現(xiàn)了不少新東西,例如:原來@value實(shí)例變量是不能在方法外部賦值的。。。

首先說說發(fā)現(xiàn)的(新)東西吧

1、attr_accessor相當(dāng)于生成一個:@value的實(shí)例變量,但是這個實(shí)例變量僅在調(diào)用了 instance.value 或者 self.value 的時候(要是直接@value聲明的話- -肯定會直接生成啊)才會生成

以下測試方法


class TestRuby

    attr_accessor:value

    def setValue

          self.value = 10

    end

    def output

          puts "#{instance_variables}"

          puts value

    end

end

測試執(zhí)行代碼1:

a = TestRuby.new
a.output

輸出結(jié)果: []

測試執(zhí)行代碼2:

a = TestRuby.new
a.setValue
a.output

輸出結(jié)果:[:@value] 10

測試執(zhí)行代碼3:

a = TestRuby.new
a.value = 199
a.output

輸出結(jié)果:[:@value] 199

2、當(dāng)使用 attr_accessor:value 后,直接調(diào)用value的時候,有個優(yōu)先級的屬性,初步的探討,我覺得有以下情況(可能是廢話)

  • 局部變量>實(shí)例變量
    同樣扔上測試的類:
class TestRuby
    attr_accessor:value

    def output
        value = 10086
        puts "#{instance_variables}"
        puts value
    end
end

測試執(zhí)行代碼:

a = TestRuby.new
a.value = 199
a.output

輸出結(jié)果:[:@value] 10086

當(dāng)然,如果將puts value 改為 puts self.value,那么得到的一般就是199的結(jié)果了

  • 方法>實(shí)例變量
    測試類:
class TestRuby
    attr_accessor:value

    def value
        puts "i am method"
    end

    def output
        puts "#{instance_variables}"
        puts self.value
    end
end

測試執(zhí)行代碼:

a = TestRuby.new
a.value = 199
a.output

輸出結(jié)果:[:@value] i am method

= =這種情況,恕我太菜,我不曉得如何在方法外部取到這個實(shí)例變量的值了,有知道的大牛們可以帶帶我~~

測試環(huán)境:macOS10.12 ruby 2.3.0p0 (2015-12-25 revision 53290) [x86_64-darwin16]

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容