Ruby关于下标方法重定义的问题

 mobiledu2502869077 发布于 2022-10-26 06:21

正在学习《Ruby基础教程》一书,同时测试书上的代码例子,其中有一个关于数组下标方法的重定义代码,在调试的时候出现错误:

point.rb:46:in `[]=': undefined method `x=' for (4, 7):Point (NoMethodError)
    from point.rb:70:in `
'

整个例子代码如下:

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

请问为什么会出现说赋值方法没有定义的错误提示?

1 个回答
  • 因为你真的没有定义#x=

    attr_reader :x, :y只定义#x, #y

    你要么再定义#x=#y=, 要么把self.x = val改成@x = val

    2022-10-27 00:32 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有