Удалить первый экземпляр соответствующего элемента из массива - PullRequest
32 голосов
/ 04 января 2011

Скажем, у меня есть массив [1,2,3,1,2,3], и я хочу удалить первый экземпляр (скажем) 2 из массива, давая [1,3,1,2,3]. Какой самый простой способ?

Ответы [ 3 ]

64 голосов
/ 04 января 2011
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]
14 голосов
/ 24 апреля 2011

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

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

4 голосов
/ 07 октября 2015

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

class Array
  def delete_first item
    delete_at(index(item) || length)
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...