我看到很多* args和& blk被传递的例子和收益率的例子。但是,我只想说我想克隆(不是克隆方法,而是克隆的动作)从一个Object到另一个Object的方法。
示例:
class String
def all?
self.split("").all?
end
end
无论情况如何,我如何最好地处理可选参数或块的所有边缘情况。这不是我需要使用方法克隆的唯一情况。我只想到,因为你看到这个方法在作为克隆之前做了一个修改,你会得到这个想法。
我不希望我的方法提出它自己的错误。我想要被调用的克隆方法给它自己的错误。
答案 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?
并且您可以传递相同的参数,就像您直接调用链式方法一样。