新手问题 《Ruby 基础教程 第 5 版》P96,代码清单 8.6 中运行出现 bug

Thomas · 2019年04月06日 · 最后由 Thomas 回复于 2019年04月10日 · 1668 次阅读

class Point attr_accessor:x,:y protected :x=,:y=

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

def swap(other) temp_x,temp_y=@x,@y

@x,@y=other.x,other.y

other.x,other.y=temp_x,temp_y return self

end

end

p0=Point.new p1=Point.new(1.0,2.0)

p0.swap(p1)

在 Mac 运行的时候,提示: Traceback (most recent call last): 1: from point.rb:24:in <main>' point.rb:9:inswap': wrong number of arguments (given 0, expected 1) (ArgumentError)

指出传入的参数为 0,但是@x,@y=other.x,other.y 中,other.x,other.y 这样就不算参数了?需要如何去修改这个代码?

新手不懂,麻烦告知。谢谢

先把代码搞整洁吧。似乎这个代码没有问题。

class Point 
  attr_accessor :x,:y 
  protected :x=,:y=

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

  def swap(other) 
    temp_x,temp_y=@x,@y
    @x,@y=other.x,other.y
    other.x,other.y=temp_x,temp_y
    return self
  end
end

p0=Point.new
p1=Point.new(1.0,2.0)

p0.swap(p1)

chenge 回复

可是运行的时候,提示:Traceback (most recent call last): 1: from point.rb:24:in ' point.rb:9:inswap': wrong number of arguments (given 0, expected 1) (ArgumentError),提示参数不正确,这是什么原因引起?

Thomas 回复

你试验下在 irb 或者 pry 下运行看。可能是环境和版本问题吧。

chenge 回复

我用 irb 试了一下,还是出现同样问题,不知道是不是版本原因引起:

是你写错了。swap 需要一个参数,你没给。你试验下这个吧:

p1 = Point.new
p2 = Point.new(1, 2)
p1.swap(p2)

swap 方法没带参数……

定义的 def swap(other) 这个 other 是参数,你在用 Hello.swap 时候应该加上参数 Hello.swap(这里是参数)

@yfscret @chenge @baboon 谢谢大神指点,我果然漏了参数,加上参数后解释运行就没问题了,感谢各位!

@ThomasRuby is DEAD的谣言下,能分享一下为什么学 Ruby 吗?

rocLv 回复

Ruby 设计众多的奇妙语法糖能让代码迸发出出奇的精彩,这就是写 Ruby 的快乐。

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