7

条件が真のときに配列からアイテムをポップしてコレクションを返すRubyのイディオムはありますか?

すなわち、

# Would pop all negative numbers from the end of 'array' and place them into 'result'.
result = array.pop {|i| i < 0} 

私の知る限り、上記のようなものは存在しません。

私は現在使用しています

result = []
while array.last < 0 do
  result << array.pop
end
4

3 に答える 3

7

多分あなたは探していtake_whileますか?

array = [-1, -2, 0, 34, 42, -8, -4]
result = array.reverse.take_while { |x| x < 0 }

resultでしょう[-8, -4]

元の結果を取り戻すには、drop_while代わりに使用できます。

result = array.reverse.drop_while { |x| x < 0 }.reverse

result[-1, -2, 0, 34, 42]この場合でしょう。

于 2013-03-14T16:51:40.760 に答える
1

あなたはそれを自分で書くことができます:

class Array
  def pop_while(&block)
    result = []
    while not self.empty? and yield(self.last)
      result << self.pop
    end
    return result
  end
end

result = array.pop_while { |i| i < 0 }
于 2013-03-14T16:56:43.457 に答える
0

条件を満たすすべてのアイテムをポップするソリューションを探している場合は、 a のselect後に a が続くことを検討してくださいdelete_if

x = [*-10..10].sample(10)
# [-9, -2, -8, 0, 7, 9, -1, 10, -10, 3]
neg = x.select {|i| i < 0}
# [-9, -2, -8, -1, -10]
pos = x.delete_if {|i| i < 0}
# [0, 7, 9, 10, 3]
# note that `delete_if` modifies x
# so at this point `pos == x`
于 2015-11-27T03:36:15.173 に答える