关于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]

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容