首先attr_accessor相当于attr_reader和attr_writer的合体版,相当于在class里面生成了setter和getter方法吧,使得ruby能够使用 instance.value 的形式赋值和取值,更加方便吧
一开始没能理解,于是测试了很多遍,也发现了不少新东西,例如:原来@value实例变量是不能在方法外部赋值的。。。
首先说说发现的(新)东西吧
1、attr_accessor相当于生成一个:@value的实例变量,但是这个实例变量仅在调用了 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
测试执行代码1:
a = TestRuby.new
a.output
输出结果: []
测试执行代码2:
a = TestRuby.new
a.setValue
a.output
输出结果:[:@value] 10
测试执行代码3:
a = TestRuby.new
a.value = 199
a.output
输出结果:[:@value] 199
2、当使用 attr_accessor:value 后,直接调用value的时候,有个优先级的属性,初步的探讨,我觉得有以下情况(可能是废话)
- 局部变量>实例变量
同样扔上测试的类:
class TestRuby
attr_accessor:value
def output
value = 10086
puts "#{instance_variables}"
puts value
end
end
测试执行代码:
a = TestRuby.new
a.value = 199
a.output
输出结果:[:@value] 10086
当然,如果将puts value 改为 puts self.value,那么得到的一般就是199的结果了
- 方法>实例变量
测试类:
class TestRuby
attr_accessor:value
def value
puts "i am method"
end
def output
puts "#{instance_variables}"
puts self.value
end
end
测试执行代码:
a = TestRuby.new
a.value = 199
a.output
输出结果:[:@value] i am method
= =这种情况,恕我太菜,我不晓得如何在方法外部取到这个实例变量的值了,有知道的大牛们可以带带我~~
测试环境:macOS10.12 ruby 2.3.0p0 (2015-12-25 revision 53290) [x86_64-darwin16]