首先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]