2011-01-04 2 views

ответ

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

li[li.length] находится вне диапазона, поэтому || li.length обрабатывает случай, когда n нет в списке.

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

спасибо. Я избивал голову, пытаясь выразить это элегантно. –

+0

Я не понимаю '|| li.length' может кто угодно объяснить – gates

+1

Любое значение в ruby ​​можно рассматривать как логическое значение, при этом только false и nil вычисляются как false. Синтаксис с двойной трубкой является удобным сокращением. 'a || b' означает «a, если он не равен нулю, затем b». – erich2k8

12

Если || li.length чтобы избежать отправки nil в li.delete_at (что приведет к TypeError), то более читаемым версия может выглядеть следующим образом

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

+6

Вероятно, вы хотите хранить 'li.index (42)' в переменной, чтобы предотвратить повторный поиск. Производительность будет намного лучше для больших массивов. – Kelvin

4

Может быть, это должно стать частью STDLIB :

class Array 
    def delete_first item 
    delete_at(index(item) || length) 
    end 
end 
Смежные вопросы