1

是否有一种快速的 Ruby 或 Rails 方法可以根据块中提供的条件从数组中删除一个元素,然后返回该元素?

假设:

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

4 回答 4

1

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

于 2012-12-06T05:59:09.690 回答
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

于 2012-12-06T06:05:29.840 回答
1

如果您没有重复项或您想删除所有相同的元素,您可以这样做

a.delete(a.detect(&:good?))
  • a.detect(&:good?)将返回第一个good?对象,或者nil如果没有。
  • a.delete(elem)将删除并返回您的元素。

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

a.delete(a.index(a.detect(&:good?)))
于 2012-12-06T06:15:17.293 回答
0
 a = [e1, e2, e3]

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

 it will delete e1. and returns e2 and e3
于 2012-12-06T06:02:32.930 回答