【问题标题】:Pass block passed to method to another method in Ruby将块传递给方法传递给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 方法。我如何做到这一点?

【问题讨论】:

    标签: ruby block


    【解决方案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' 对象,并且它不是空闲的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-10
      • 2014-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多