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

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

Ответ 1

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]

Ответ 2

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

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

Ответ 3

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

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