问题描述
正在学习《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 indexwhen 0 xwhen 1 yelse raise ArgumentError, 'out of range ’#{index}’'end end def []=(index,val)case indexwhen 0 self.x = valwhen 1 self.y = valelse raise ArgumentError, 'out of range ’#{index}’' end endendpoint0 = Point.new(3,6)point1 = Point.new(1,8)p point0p point1p point0 + point1p point0 - point1p +point0p -point0p ~point0point = Point.new(4,7)p point[0]p point[1]point[0] = 2
请问为什么会出现说赋值方法没有定义的错误提示?
问题解答
回答1:因为你真的没有定义#x=
attr_reader :x, :y只定义#x, #y
你要么再定义#x=和#y=, 要么把self.x = val改成@x = val