#4 楼 @awking 非常感谢,我明白了,我改了下代码,可以看出来如果不赋值给@x,或者 self.x 的话,x 的 object_id 是不一样的,非常感谢!
class Point
attr_accessor :x, :y
def initialize(x=0, y=0)
@x, @y = x, y
end
def [](index)
case index
when 0
puts "x objcet_id = #{x.object_id}\n@x object id = #{@x.object_id}"
when 1
y
else
raise ArgumentError ," out of range #{index}"
end
end
def []=(index, val)
case index
when 0
x= val
puts "x的objcet_id 是:#{x.object_id}"
puts "@x的object id 是: #{@x.object_id}"
puts "self的x的object_id 是: #{self.x.object_id}"
when 1
y= val
else
raise ArgumentError, "out of range #{index}"
end
end
end
p1 = Point.new(22,11)
p p1[0]
p p1[0] = 333
#4 楼 @awking 嗯嗯,非常感谢,我大概明白了,我重复你下,您看我说的对吗 代码 1
case index
when 0
x
==begin 这里的x 等价与 @x,是因为ruby在case when结构的代码段读取x变量,case内部作用域没有
变量x,所以去外部找寻找变量(以前学过一点儿c,c语言在本作用域没找到变量,会去外部找离他最近的变量值,所以找到了@x),结果找到了@x,所以就把@x的值输出,这里x 就成为了@x的简称--这种说法对吗?
==end
when 1
y
else
raise ArgumentError ," out of range #{index}"
end
代码 2:
def []=(index, val)
case index
when 0
self.x= val
==begin
这里用self.x @x都可以。但是你如果用 x= val.ruby会认为你要创建一个局部变量x,所以根本不会去外部的作用域去找那个x的变量,而是在本作用域创建一个局部变量x,然后赋值给这个x了
==end
when 1
self.y= val
else
raise ArgumentError, "out of range #{index}"
end
end
无论如何非常感谢!
@blacktulip 明白了,非常感谢!
多谢各位了,确实是这个问题,我仔细看了下 headfirst rails 的源码确实错了,那个上面没有写 "="
#4 楼 @reyesyang 没看明白啊!
楼上两位,不好意思刚才不太会用发帖的格式,修正了一下,现在代码全了!
好的,多谢,我晚上有 mac 试下!