2017-02-10 42 views
0

Я использую Ruby 2.4. Я хочу, чтобы сдирать nil элементов от конца массива, поэтому я используюКак удалить ненулевые элементы из конца массива, если все мои элементы равны нулю?

row_data.pop until row_data.last 

, но если массив содержит только nil элементы, это, кажется, вызывает какое-то бесконечный цикл, поскольку вызов никогда не возвращается. Как я могу объяснить, что массив может содержать все элементы nil?

+0

Для пустого массива, что же row_data.last вычисляться? Как можно обнаружить пустой массив? Обновите логическое состояние соответственно. – user2864740

+0

Когда вы говорите: «Обновите логическое условие соответственно», как мне это сделать? –

+0

'.. до updated_logic_condition_that_will_be_true_when_element_is_falsey_or_array_is_empty' (также показанное исходное условие также исключает значения« false »). – user2864740

ответ

3

Просто добавьте дополнительную проверку, чтобы увидеть, пуст ли массив.

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

Очень приятно. Может быть, лучше писать 'row_data.pop while row_data.any? && row_data.last.nil? '. Кроме того, это не возвращает измененные 'row_data', поэтому требуется другая строка' row_data', если, например, она завернута в метод. –

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] : []) 
1

Попробуйте

Наиболее читаемыми

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

Наиболее эффективный

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

 Смежные вопросы

  • Нет связанных вопросов^_^