我正在try 编写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方法.我如何做到这一点?

推荐答案

可以显式引用块

def discard(&block)
  self - self.keep(&block)
end

或者含蓄地

def discard
  self - self.keep(&Proc.new {})
end

在你的情况下,我建议第一种方法.

Ruby相关问答推荐

Ruby Case语句和固定,不适用于attr_reader

如何判断 postgres 中使用 ruby​​ 的查询是否失败?

Ruby 中使用的-S标志是什么?

Ruby - 将两个哈希与一些相似的键合并

数组切片中没有左边框的Ruby范围

是否有类似于 Ruby 的 Sinatra 的 .NET 框架?

如何通过 Rack 提供静态文件?

无法在 Heroku 教程中使用 Python 启动工头

在 Ruby 早期转义 .each { } 迭代

如何获取字符串中所有出现的 Ruby 正则表达式的匹配数据?

如何找到安装 Ruby Gem 的路径(即 Gem.lib_path c.f. Gem.bin_path)

判断字符串是否包含Ruby数组中的任何子字符串

我可以在 Ruby 2.x 中要求命名参数吗?

Ruby:更新哈希值的最简单方法是什么?

如何在 Ruby 脚本中运行 Rake 任务?

处理来自 Net::HTTP 的异常的最佳方法是什么?

使用 RSpec 判断某物是否是另一个对象的实例

为什么 Ruby 文档中的方法前面有一个井号?

在 Ruby 中解析制表符分隔文件的最佳方法是什么?

如何在 Ruby 中实现回调?