连接实例方法,即var.method1.method2

时间:2011-10-20 23:44:51

标签: ruby

我正在尝试编写两个实例方法,其中method2可以处理method1的输出。

例如,像这样:

puts Numbers::new(2,2).sum.sqrt

>16

我认为代码看起来像这样:

class Numbers

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

  def sum
    @z=@x+@y
  end

  def sqrt
    @z**2
  end

end

情况并非如此,当我尝试调用sqrt时,我得到NoM​​ethodError。

我知道我在这里遗漏了一些简单而基本的东西,但我找不到直接的答案。

谢谢!

2 个答案:

答案 0 :(得分:6)

sum方法返回@z的值Fixnum。 Ruby正试图在sqrt实例上执行Fixnum方法,因此也是例外。

可能这就是你想要的:

class Fixnum
  def square
    self**2
  end
end

class Array
  def sum
    reduce(0, &:+)
  end
end

现在你可以:

[1,2].sum.square # 9

答案 1 :(得分:0)

为了调用实例方法,您需要一个实例 - 您的sum方法需要返回实例以允许链接(与sqrt相同)。

方法链接很常见,但IMO在这种情况下有点违反直觉。