正在学习《Ruby基础教程》一书,同时测试书上的代码例子,其中有一个关于数组下标方法的重定义代码,在调试的时候出现错误:
point.rb:46:in `[]=': undefined method `x=' for (4, 7):Point (NoMethodError)
from point.rb:70:in `<main>'
整个例子代码如下:
class Point
attr_reader :x, :y
def initialize(x=0, y=0)
@x, @y = x, y
end
def inspect
"(#{x}, #{y})"
end
def +(other)
self.class.new(x + other.x, y + other.y)
end
def -(other)
self.class.new(x - other.x, y - other.y)
end
def -@
self.class.new(-x, -y)
end
def +@
dup
end
def ~@
self.class.new(-y, x)
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
when 1
self.y = val
else
raise ArgumentError, "out of range '#{index}'"
end
end
end
point0 = Point.new(3,6)
point1 = Point.new(1,8)
p point0
p point1
p point0 + point1
p point0 - point1
p +point0
p -point0
p ~point0
point = Point.new(4,7)
p point[0]
p point[1]
point[0] = 2
请问为什么会出现说赋值方法没有定义的错误提示?
Because you really have no definition
#x=
attr_reader :x, :y
只定义#x
,#y
You can either redefine
#x=
和#y=
, 要么把self.x = val
改成@x = val
and#y=
, or changeself.x = val
to@x = val