(1..4).collect do |x|
  next if x == 3
  x + 1
end # => [2, 3, nil, 5]
    # desired => [2, 3, 5]

如果满足next的条件,collect会将nil放入数组,而我要做的是在满足条件的情况下将no元素放入返回的array.这是否可以在不调用返回数组上的delete_if { |x| x == nil }的情况下实现?

(使用Ruby 1.8.7;我的代码节选是高度抽象的)

推荐答案

有一种方法Enumerable#reject的目的是:

(1..4).reject{|x| x == 3}.collect{|x| x + 1}

直接使用一个方法的输出作为另一个方法的输入的做法称为method chaining,这在Ruby中非常常见.

顺便说一句,map(或collect)用于将输入枚举直接映射到输出枚举.如果需要输出不同数量的元素,则可能需要另一种Enumerable的方法.

编辑:如果您对某些元素重复两次感到困扰,可以使用基于inject(或其类似方法each_with_object)的不太优雅的解决方案:

(1..4).each_with_object([]){|x,a| a << x + 1 unless x == 3}

Ruby相关问答推荐

如何使用 gsub 删除返回字符串中的/和/i?

Ruby 3 从多个预定纤程中收集结果

Ruby 中的 Hash[key] 返回 nil 但 hash 没有 nil 值

Simple_form:删除带有标签的内联复选框的外部标签

Ruby 将字符串转换为方法名

Ruby:子字符串到一定长度,也到子字符串中的最后一个空格

在 rake 任务中提问

在 Ruby 中覆盖 == 运算符

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

在 Ruby 中,有没有办法使用 hash.each_with_index do |[k,v], i| 之类的东西?

Ruby 被空格分割

在 Ruby 中定义 [方括号] 方法是如何工作的?

Ruby,生成随机十六进制 colored颜色

是什么让 Ruby 变慢了?

判断 Ruby 中是否存在 URL

rbenv install --list 不列出 2.1.2 版本

将整个文本文件作为单个字符串读取的合理方法是什么?

Ruby 是否有像栈、队列、链表、映射或集合这样的容器?

Eclipse 的首选 Ruby 插件?

如何使用 Ruby 删除回车?