Ruby ruby 基础教程 P125 point.rb 问题

tonysh · 2014年09月29日 · 最后由 tonysh 回复于 2014年09月29日 · 2273 次阅读

ruby 基础教程 P125 point.rb

class Point
  attr_reader :x, :y

  def initialize(x=0, y=0)
    @x, @y = x, y
  end

  def inspect
    "(#{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
    when 1
      self.y = val
    else
      raise ArgumentError ,"out of range '#{index}'"
    end
  end
end


point = Point.new(1,2)


p point[0]
p point[1] = 2

运行后报出: C:\Ruby200-x64\bin\ruby.exe -e $stdout.sync=true;$stderr.sync=true;load($0=ARGV.shift) C:/Users/Administrator/RubymineProjects/learning/point C:/Users/Administrator/RubymineProjects/learning/point:23:in []': wrong number of arguments (1 for 2) (ArgumentError) from C:/Users/Administrator/RubymineProjects/learning/point:39:in' from -e:1:in load' from -e:1:in'

Process finished with exit code 1

这是什么问题导致的?请高手帮忙看看。

#1 楼 @jyootai 缩减问题可能是提交到网页出现问题

补一个完整的:

class Point
  attr_reader :x, :y

  def initialize(x=0, y=0)
    @x, @y = x, y
  end

  def inspect
    "(#{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
    when 1
      self.y = val
    else
      raise ArgumentError ,"out of range '#{index}'"
    end
  end
end


point = Point.new(1,2)


p point[0]
p point[1] = 2

原来是 def 写错了。 应该是:

def []=(index,val)

self.x = val -> x = val self.y = val -> y = val
这样 ?

#4 楼 @jyootai 已经改好了 是

def []=(index,val)

你的-> 这符号还没有看到,不懂什么意思。

排好版有那么难么?!

#5 楼 @tonysh 其实我还是觉得你这段代码有问题。 执行 p point[0]是没有问题的,但执行p point[1] = 2就有问题了, attr_reader 是为给定名字的实例变量创建同名的读者方法,因此里面那段self.x = valself.y = val执行写是没法的,最好是将 attr_reader 改为 attr_accessor

#7 楼 @jyootai 谢谢 自己已经改了 attr_accessor

#6 楼 @huacnlee 不是开发出身,对排版有什么好的建议吗?

#9 楼 @tonysh 请认真阅读发帖页面的帮助信息! 还有这贴: https://ruby-china.org/topics/13152

需要 登录 后方可回复, 如果你还没有账号请 注册新账号