美文网首页
关于attr_accessor的理解

关于attr_accessor的理解

作者: 晏zi | 来源:发表于2017-09-04 19:39 被阅读26次

    首先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的理解

          本文链接:https://www.haomeiwen.com/subject/eqzejxtx.html