2011-01-04 17 views

Odpowiedz

61
li.delete_at(li.index(n) || li.length) 

li[li.length] jest poza zasięgiem, więc || li.length obsługuje przypadek, w którym n nie ma na liście.

irb(main):001:0> li = [1,2,3,1,2,3] 
=> [1, 2, 3, 1, 2, 3] 
irb(main):002:0> li.delete_at(li.index(2) || li.length) 
=> 2 
irb(main):003:0> li.delete_at(li.index(42) || li.length) 
=> nil 
irb(main):004:0> li 
=> [1, 3, 1, 2, 3] 
+0

Dziękuję. Biłem się w głowę, próbując wyrazić to elegancko. –

+0

Nie rozumiem '|| li.length' może ktoś proszę wyjaśnić – gates

+1

Każda wartość w ruby ​​może być traktowana jako wartość boolowska, przy czym tylko wartość "false" i "zero" są wartościami "false". Składnia podwójnej rury jest wygodnym skrótem. 'a || b "oznacza" a, chyba że jest zerowe, a następnie b ". – erich2k8

12

Jeśli || li.length jest, aby uniknąć wysyłania nil do li.delete_at (co spowodowałoby TypeError), a następnie bardziej czytelny wersja może wyglądać następująco

li.delete_at li.index(42) unless li.index(42).nil?

+6

Prawdopodobnie chcesz zapisać 'li.index (42)' w zmiennej, aby zapobiec dwukrotnemu wyszukiwaniu. Wydajność będzie znacznie lepsza dla dużych tablic. – Kelvin

4

Może to stać się częścią stdlib :

class Array 
    def delete_first item 
    delete_at(index(item) || length) 
    end 
end 
Powiązane problemy