2011-01-04 13 views

Respuesta

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

li[li.length] está fuera de rango, por lo que el || li.length Trata el caso en n no está en la lista.

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

Gracias. He estado golpeando mi cabeza tratando de expresar esto elegantemente. –

+0

No entiendo el '|| li.length' ¿Alguien puede explicar – gates

+1

Cualquier valor en ruby ​​se puede tratar como un valor booleano, con solo 'false' y' nil' evaluando como falso. La sintaxis de doble pipa es una taquigrafía conveniente. 'a || b' significa "a, a menos que sea nulo, luego b". – erich2k8

12

Si || li.length es evitar el envío de nil a li.delete_at (lo que resultaría en un TypeError), a continuación, una versión más fácil podría tener este aspecto

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

+6

Es probable que desee almacenar 'li.index (42)' en una variable, para evitar hacer la búsqueda dos veces. El rendimiento será mucho mejor para arreglos grandes. – Kelvin

4

Tal vez debería formar parte de stdlib :

class Array 
    def delete_first item 
    delete_at(index(item) || length) 
    end 
end 
Cuestiones relacionadas