2017-02-10 3 views
0

Ich benutze Ruby 2.4. Ich möchte nil Elemente aus dem Ende eines Arrays abzustreifen, also verwende ichWie entferne ich Nil-Elemente vom Ende eines Arrays, wenn alle meine Elemente Null sind?

row_data.pop until row_data.last 

aber wenn das Array nur nil Elemente enthält, scheint dies eine Art Endlosschleife zu verursachen, da der Anruf nicht zurückgibt. Wie berücksichtige ich die Tatsache, dass das Array möglicherweise alle Nil-Elemente enthält?

+0

Für ein leeres Array, was nicht row_data.last zu bewerten? Wie kann ein leeres Array erkannt werden? Aktualisieren Sie die logische Bedingung entsprechend. – user2864740

+0

Wenn Sie sagen, "Update die logische Bedingung entsprechend", wie mache ich das? –

+0

'.. bis updated_logic_condition_that_will_be_true_when_element_is_falsey_or_array_is_empty' (auch die ursprüngliche Bedingung wird auch' falsche' Werte ausschließen). – user2864740

Antwort

3

Fügen Sie einfach eine zusätzliche Überprüfung hinzu, um festzustellen, ob das Array leer ist.

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

Sehr schön. Es könnte besser sein, 'row_data.pop während row_data.any zu schreiben? && row_data.last.nil? '. Außerdem gibt dies nicht die modifizierten 'row_data' zurück, so dass eine andere Zeile' row_data' benötigt wird, wenn sie zum Beispiel in eine Methode eingebunden ist. –

1

kann Array#rindex verwenden, um den am weitesten rechts liegenden Nicht-NULL-Eintrag zu erhalten (oder bestimmen, dass jedes Element im Array ist 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] 
    #=> [] 

Dies mutiert nicht das ursprüngliche Array. Wenn Sie das Array an seinem Platz ändern möchten, ändern Sie die vorletzte Zeile

arr.replace(ndx ? arr[0..ndx] : []) 
1

Versuchen Sie, diese

meisten lesbar

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

Am effizientesten

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