如果我的所有元素都是 nil,如何从数组末尾剥离 nil 元素?

How do I strip off nil elements from the end of an array if all my elements are nil?

我正在使用 Ruby 2.4。我想从数组末尾剥离 nil 个元素,所以我使用

row_data.pop until row_data.last

但是如果数组只包含 nil 个元素,这似乎会导致某种无限循环,因为调用永远不会 returns。我如何解释数组可能包含所有 nil 元素的事实?

只需添加一个额外的检查以查看数组是否为空。

row_data.pop until row_data.last || row_data.empty?

可以用Array#rindex获取right-mostnon-nil项(或者确定数组中的每个元素都是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] : [])

试试这个

最易读

arr = arr.reverse.drop_while(&:nil?).reverse

效率最高

arr.slice!(0..arr.rindex { |each| nil != each }.to_i)

如果要删除所有 nil,试试这个:

[1, nil, 3, nil, nil].compact #= [1,3]

Map and Remove nil values in Ruby