根据条件块从Array中删除元素并返回该元素

时间:2012-12-06 05:55:15

标签: ruby-on-rails ruby

是否有快速的Ruby或Rails方法根据块中提供的条件从Array中删除元素然后返回该元素?

让我们说,给定:

e1.good? # false
e2.good? # true
e3.good? # true
a = [e1, e2, e3]

是否有方法delete_and_return_if执行此操作:

a.delete_and_return_if { |e| e.good? }      # delete e2 from a and returns e2
[e1].delete_and_return_if { |e| e.good? }   # returns nil

或者至少有一种干净的方法可以做到这一点吗?

4 个答案:

答案 0 :(得分:1)

有delete_if,这是一个Ruby函数。 http://www.ruby-doc.org/core-1.9.3/Array.html

答案 1 :(得分:1)

这将更新数组并返回已删除的条目:

a = [1, 2, 3]

p a
# => [1, 2, 3]

deleted = a.delete a.detect {|e| e == 2 }
p deleted
# => 2

p a
# => [1, 3]

所以你可以这样做:

a.delete a.detect(&:good?)

更新:感谢@oldergod让我回想起detect

答案 2 :(得分:1)

如果您没有重复项或要删除所有相同的元素,则可以执行

a.delete(a.detect(&:good?))
  • a.detect(&:good?)将返回第一个good?对象或nil if 空无一人。
  • a.delete(elem)将删除并返回您的元素。

或者,如果您有重复项,只想删除第一个:

a.delete(a.index(a.detect(&:good?)))

答案 3 :(得分:0)

 a = [e1, e2, e3]

 a.delete_if{|e|!e.good?}

 it will delete e1. and returns e2 and e3
相关问题