(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;我的代码节选是高度抽象的)
(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}