关于attr_accessor的理解

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

你可能感兴趣的:(关于attr_accessor的理解)