如何使用转发参数重现方法?

时间:2014-05-06 09:39:25

标签: ruby

我看到很多* args和& blk被传递的例子和收益率的例子。但是,我只想说我想克隆(不是克隆方法,而是克隆的动作)从一个Object到另一个Object的方法。

示例:

class String
    def all?
        self.split("").all?
    end
end

无论情况如何,我如何最好地处理可选参数或块的所有边缘情况。这不是我需要使用方法克隆的唯一情况。我只想到,因为你看到这个方法在作为克隆之前做了一个修改,你会得到这个想法。

我不希望我的方法提出它自己的错误。我想要被调用的克隆方法给它自己的错误。

2 个答案:

答案 0 :(得分:5)

方法可以传递参数,关键字参数和块。您所要做的就是将所有这些参数转发给您正在呼叫的方法。

class String
  def all?(*arguments, **keyword_arguments, &block)
    chars.all? *arguments, **keyword_arguments, &block
  end
end

这将捕获并转发所有内容到Enumerable#all?,确保方法可以以相同的方式使用。请注意String has a chars method枚举其各自的字符。既然你正在做什么,我冒昧地使用它。

答案 1 :(得分:3)

为什么不使用delegate这样可以避免任何其他方法定义,除非您需要另外处理参数。

 class String
   extend Forwardable
   delegate :all? => :chars
 end

当您致电String.all?时,现在将调用String.chars.all?并且您可以传递相同的参数,就像您直接调用链式方法一样。