2015-02-23 73 views
1

我想從ArrayString#strip末一個刪除不必要Hash,所以我寫這樣的:是否可以每次調用Array#中的Array#pop?

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}] 

但它是確定呼叫Enumerable#eachArray#pop? 我覺得在循環內改變數組本身是不安全的。

+0

不安全,怎麼樣?雖然不是特別優雅,但如果它完成了工作......我不認爲這種方法存在任何安全問題。 – dgilperez 2015-02-23 16:08:19

回答

1

根據Matz here,修改正在迭代的集合是未定義的行爲。

而是嘗試這樣的事:

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