Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 连接实例方法,即var.method1.method2_Ruby - Fatal编程技术网

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

Ruby 连接实例方法,即var.method1.method2,ruby,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 我认为代码应该是这样的: puts Numbers::new

我正在尝试编写两个实例方法,其中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
我认为代码应该是这样的:

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时,我会得到一个命名错误

我知道我遗漏了一些简单和基本的东西,但我找不到一个直接的答案


谢谢大家!

sum方法返回
@z
的值,该值是一个
Fixnum
。Ruby正在尝试对
Fixnum
实例执行
sqrt
方法,因此出现异常

也许这就是你想要的:

class Fixnum
  def square
    self**2
  end
end

class Array
  def sum
    reduce(0, &:+)
  end
end
现在您可以:

[1,2].sum.square # 9

sum
方法返回
@z
的值,该值是一个
Fixnum
。Ruby正在尝试对
Fixnum
实例执行
sqrt
方法,因此出现异常

也许这就是你想要的:

class Fixnum
  def square
    self**2
  end
end

class Array
  def sum
    reduce(0, &:+)
  end
end
现在您可以:

[1,2].sum.square # 9

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


方法链接很常见,但在这种情况下我有点不直观。

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


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

将这些方法添加到最能代表您所要做的事情的核心类中听起来比创建自己的几乎没有任何功能的类要好得多。@Kandaboggu,谢谢。我特别感兴趣的是让method1返回一个可以由method2处理的实例,所以我将尝试下面Dave的建议。非常感谢。将这些方法添加到最能代表您所要做的事情的核心类中听起来比创建自己的几乎没有任何特性的类要好得多。@Kandaboggu,谢谢。我特别感兴趣的是让method1返回一个可以由method2处理的实例,所以我将尝试下面Dave的建议。非常感谢。你能详细说明一下吗?如何使方法返回实例?@eLi。只是“回归自我”。记住在Ruby中,方法返回其最后一条语句的值,正如Kandada所说,在本例中,sum返回z。(你不需要在Ruby中显式返回;你可以只写“self”作为最后一个语句。)他的代码也更有意义,但这取决于你真正想做什么。至于我想做的:我有一组数据,我正在进行几个步骤的分析。我在每个单独的步骤中都有一些用于输出的实用程序,所以我想有一种方法来单独保存每个输出。直觉上,我认为用多个方法(每个步骤一个方法)创建一个类将是一个很好的方法。因此,当我想要最终结果时,我可以执行诸如DATA::new(path).step1.step2.stepN之类的操作,或者当我只想要step2的输出时,只执行DATA::new(path).step1.step2。@eLi。我怀疑,正如另一个答案所建议的那样,将方法添加到数据类型中更为简洁,尽管这实际上是一个文体/认知的序言。。。只是更干净,我明白了。我是一个新手,为了确保我理解正确。Kandaboggu建议采用“向数据类型添加方法”的方法。如果step1返回一个散列,进入Ruby的散列类并为step2添加一个方法。若步骤2返回一个数组,那个么进入array类并为步骤3添加方法。这样我就可以像我想的那样把台阶锁起来。你能详细说明一下吗?如何使方法返回实例?@eLi。只是“回归自我”。记住在Ruby中,方法返回其最后一条语句的值,正如Kandada所说,在本例中,sum返回z。(你不需要在Ruby中显式返回;你可以只写“self”作为最后一个语句。)他的代码也更有意义,但这取决于你真正想做什么。至于我想做的:我有一组数据,我正在进行几个步骤的分析。我在每个单独的步骤中都有一些用于输出的实用程序,所以我想有一种方法来单独保存每个输出。直觉上,我认为用多个方法(每个步骤一个方法)创建一个类将是一个很好的方法。因此,当我想要最终结果时,我可以执行诸如DATA::new(path).step1.step2.stepN之类的操作,或者当我只想要step2的输出时,只执行DATA::new(path).step1.step2。@eLi。我怀疑,正如另一个答案所建议的那样,将方法添加到数据类型中更为简洁,尽管这实际上是一个文体/认知的序言。。。只是更干净,我明白了。我是一个新手,为了确保我理解正确。Kandaboggu建议采用“向数据类型添加方法”的方法。如果step1返回一个散列,进入Ruby的散列类并为step2添加一个方法。若步骤2返回一个数组,那个么进入array类并为步骤3添加方法。这样我就可以像我想的那样把台阶锁起来。