我使用的是Ruby 2.4。我想从数组末尾删除nil
元素,所以我使用
row_data.pop until row_data.last
但是如果数组只包含nil
元素,这似乎会导致某种无限循环,因为调用永远不会返回。我如何解释数组可能包含所有nil元素的事实?
答案 0 :(得分:3)
只需添加额外的检查以查看数组是否为空。
row_data.pop until row_data.last || row_data.empty?
答案 1 :(得分:1)
您可以使用Array#rindex获取最右边的非零条目(或确定数组中的每个元素都是nil
)。
def kill_nils_at_end(arr)
ndx = arr.rindex(&:itself)
ndx ? arr[0..ndx] : []
end
kill_nils_at_end [1,nil,1,nil,nil,nil]
#=> [1, nil, 1]
kill_nils_at_end [nil,nil,nil,nil,nil,nil]
#=> []
这不会改变原始数组。如果要修改阵列,请将倒数第二行更改为
arr.replace(ndx ? arr[0..ndx] : [])
答案 2 :(得分:1)
试试这个
最具可读性
arr = arr.reverse.drop_while(&:nil?).reverse
效率最高
arr.slice!(0..arr.rindex { |each| nil != each }.to_i)
答案 3 :(得分:0)