将块传递给方法传递给Ruby中的另一个方法
Posted
技术标签:
【中文标题】将块传递给方法传递给Ruby中的另一个方法【英文标题】:Pass block passed to method to another method in Ruby 【发布时间】:2014-01-05 21:04:57 【问题描述】:我正在尝试编写 ruby keep_if
和 delete_if
数组方法的克隆。这是我的代码。
module Strain
def keep
self.inject([]) do |extracts, element|
yield(element) ? extracts << element : extracts
end
end
def discard
self.inject([]) do |extracts, element|
!yield(element) ? extracts << element : extracts
end
end
end
class Array
include Strain
end
这行得通。但我想做这样的事情:
def discard
self - self.keep &block
end
期望的行为:
[1, 2, 3].discard |number| number < 2
# => [2, 3]
所以我需要将传递给discard
方法的块传递给keep
方法。我如何做到这一点?
【问题讨论】:
【参考方案1】:您可以显式引用该块
def discard(&block)
self - self.keep(&block)
end
或隐含
def discard
self - self.keep(&Proc.new )
end
在你的情况下,我建议第一种方法。
【讨论】:
谢谢!我最终在没有通过障碍的情况下解决了它,但我仍然学到了一些东西。 我很惊讶这就是所有需要的答案。听起来需要一个更复杂的解决方案。我将尝试制定并询问我阅读问题的原始方式【参考方案2】:在第二个例子中,&Proc.new
没有传递一个块,它创建了一个新的空块。应该省略 并将其写为
self.keep(&Proc.new)
或只是keep(&proc)
,因为self.
是多余的,而proc
是Proc.new
的推荐同义词:
# passes on the block or the absence of a block
def discard(&block)
self - keep(&block)
end
# passes on the block and fails if no block given
def discard
self - keep(&proc)
end
没有块的Proc.new
和proc
都使用当前方法的块。
如果discard
没有获得块,&proc
将失败。因此,如果您想通过块或不存在块(&nil
根本不通过块),第一个示例是最好的。如果缺少块是错误,则第二个示例(正如我更改的那样)是最好的。
在这两种情况下,每次调用 'discard' 时,都会创建一个新的 'Proc' 对象,并且它不是空闲的。
【讨论】:
以上是关于将块传递给方法传递给Ruby中的另一个方法的主要内容,如果未能解决你的问题,请参考以下文章