将块传递给方法传递给Ruby中的另一个方法

Posted

技术标签:

【中文标题】将块传递给方法传递给Ruby中的另一个方法【英文标题】:Pass block passed to method to another method in Ruby 【发布时间】:2014-01-05 21:04:57 【问题描述】:

我正在尝试编写 ruby​​ keep_ifdelete_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】:

在第二个例子中,&amp;Proc.new 没有传递一个块,它创建了一个新的空块。应该省略 并将其写为self.keep(&amp;Proc.new) 或只是keep(&amp;proc),因为self. 是多余的,而procProc.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.newproc 都使用当前方法的块。

如果discard 没有获得块,&amp;proc 将失败。因此,如果您想通过块或不存在块(&amp;nil 根本不通过块),第一个示例是最好的。如果缺少块是错误,则第二个示例(正如我更改的那样)是最好的。

在这两种情况下,每次调用 'discard' 时,都会创建一个新的 'Proc' 对象,并且它不是空闲的。

【讨论】:

以上是关于将块传递给方法传递给Ruby中的另一个方法的主要内容,如果未能解决你的问题,请参考以下文章

如何将类名作为变量传递给ruby中的另一个类

将列表传递给 Android 中的另一个 Activity

如何将多个参数作为数组传递给 ruby​​ 方法?

Ruby - 将方法作为回调传递给 DLL 库

将块传递给延迟作业

如何将从数据库接收到的数据作为道具传递给 Reactjs 中的另一个组件