有个新手问题,一直很困惑,在类内定义一个实例变量@x,在调用时候什么时候用@x,什么时候省略直接用 x, 接触 ruby 时间不长,现在看《ruby 基础教程》第四版 125 页的一个程序段
class Point
attr_accessor :x, :y
def initialize(x=0, y=0)
@x, @y = x, y
end
def [](index)
case index
when 0
x
when 1
y
else
raise ArgumentError ," out of range #{index}"
end
end
def []=(index, val)
case index
when 0
self.x= val #这里到底是用self.x还是 @x,我看两种结果都是对的,很疑惑
when 1
self.y= val
else
raise ArgumentError, "out of range #{index}"
end
end
end
p1 = Point.new(22,11)
p p1[0]
p p1[0] = 333
p p1[0]
self.x= val #这里到底是用self.x还是 @x,我看两种结果都是对的,很疑惑
,那为啥直接写 x 无法改变值呢
这行代码很疑惑,另外当把这行代码改为如下的时候:
attr_reader :x, :y
执行的时候 @x 和 x 的时候执行就有区别了,attr_reader 的时候,再赋值的是 会提示没有 x=方法,我了解 attr_reader 不会创建 x=方法,但是为啥@x=赋值又是可以的呢?没猜出根结
哪位高手能解释下吗,感谢了!