可以在Array#中调用Array#pop吗?

时间:2015-02-23 15:53:32

标签: ruby

我想从Hash的末尾删除不必要的Array,就像String#strip一样,所以我这样写了:

a = [{date: Date.today, foo: nil},
     {date: Date.today - 1, foo: 1},
     {date: Date.today - 2, foo: 8},
     {date: Date.today - 3, foo: nil},
     {date: Date.today - 4, foo: nil},
     {date: Date.today - 5, foo: 7},     
     {date: Date.today - 6, foo: nil}     
    ]

a.reverse.each do |v|
  v[:foo].nil? ? a.pop : break
end

此代码可以正常工作。

=> [{:date=>Tue, 24 Feb 2015, :foo=>nil},
 {:date=>Mon, 23 Feb 2015, :foo=>1},
 {:date=>Sun, 22 Feb 2015, :foo=>8},
 {:date=>Sat, 21 Feb 2015, :foo=>nil},
 {:date=>Fri, 20 Feb 2015, :foo=>nil},
 {:date=>Thu, 19 Feb 2015, :foo=>7}]

但是可以在Array#pop中拨打Enumerable#each吗? 我觉得在循环中更改数组本身是不安全的。

1 个答案:

答案 0 :(得分:1)

根据Matz here,修改正在迭代的集合是未定义的行为。

而是尝试这样的事情:

while ! array.last[:foo]
  array.pop
end