Ruby attr_accessor 与实例变量结合后会怎样

kgra · 2015年04月06日 · 最后由 zlfera 回复于 2015年04月07日 · 2246 次阅读
class A
    attr_accessor :var_a
    def initialize(a="a", b="b")
        puts "==initialize=="
        @var_a = a
        @var_b = b
        puts "var_a=#{var_a}"
        puts "@var_a=#{@var_a}"
        #puts "var_b=#{var_b}"#Error
        puts "@var_b=#{@var_b}"
    end

    def modify(a="modify_a", b="modify_b")
        puts "==modify=="
        var_a = a
        var_b = b
        puts "var_a=#{var_a}"
        puts "@var_a=#{@var_a}"
        puts "var_b=#{var_b}"
        puts "@var_b=#{@var_b}"
    end

    def out()
        puts "@var_a=#{@var_a}"
        puts "@var_b=#{@var_b}"
    end

    def modify_x(a="modify_a_x", b="modify_b_x")
        @var_a = a
        @var_b = b
        puts "var_a=#{var_a}"
        puts "@var_a=#{@var_a}"
        #puts "var_b=#{var_b}"#Error
        puts "@var_b=#{@var_b}"
    end


end

test = A.new()
puts "[main]A.var_a=#{test.var_a}"

puts "\n\n\n"
test.modify()
puts "[main]A.var_a=#{test.var_a}"

puts "\n\n\n"
test.var_a = "out_modify_a"
test.out
puts "[main]A.var_a=#{test.var_a}"

puts "\n\n\n"
test.modify_x
puts "[main]A.var_a=#{test.var_a}"

结果如下:

==initialize==
var_a=a
@var_a=a
@var_b=b
[main]A.var_a=a



==modify==
var_a=modify_a
@var_a=a
var_b=modify_b
@var_b=b
[main]A.var_a=a



@var_a=out_modify_a
@var_b=b
[main]A.var_a=out_modify_a



var_a=modify_a_x
@var_a=modify_a_x
@var_b=modify_b_x
[main]A.var_a=modify_a_x

谁能解释下 modify 函数中 var_a 修改了,@var_a没有修改 modify_x 函数中@var_a修改了,var_a 也修改了

欢聚话说:attr_accessor,再类内部能 get,不能 set 而对于对象,既可以 get,也能 set 我的理解有问题没?

你的 modify 方法中,var_a = a 是个局部变量赋值,self.var_a = a 或者 var_a=(a) 才对

#1 楼 @luikore 那 modify_x 中,没有 var_a,只有@var_a,为什么 puts 的时候可以 var_a

#2 楼 @kgra

首先你要明白 attr_accessor 干了什么,它相当于定义了两个方法: var_a=var_a , 这两个包装方法是读写 实例变量 @var_a 的。所以 modify_x 中的 @var_a = ...self.var_a = ... 效果是一样的,但!var_a = ... 的写法始终是给 局部变量 var_a 赋值,就算它名字和 attr_reader / writer 一摸一样,都不会去调用那两个方法,你这么写只是碰巧同名而已

#3 楼 @luikore 亲,你说的我都懂,我 modify_x 中没有定义 var_a 这个变量,但能 puts,且与@var_a这个值相同

@kgra 这个 var_a 是一个实例方法,你在 var_a 后面加一对()试试

需要 登录 后方可回复, 如果你还没有账号请 注册新账号