Подтвердить что ты не робот

Array # delete, но верните массив?

Есть ли встроенный метод, который выполняет ту же функцию, что и Array#delete, но возвращает self? Я бы хотел сделать это, не используя блок и яснее, чем an_ary.-([el]).

Я мог бы обезвредить один, но похоже, что метод "компактный с аргументами" будет относительно общим желанием?

4b9b3361

Ответ 1

Если вы хотите изменить исходный массив, например delete, вот параметры:

ary.reject!{|e| e==42 }.something_else
ary.tap{|a| a.delete 42}.something_else
(ary.delete 42;ary).something_else
(ary-=[42]).something_else

Если вы хотите, чтобы новый массив связывался с:

ary.reject{|e| e==42 }.something_else
(ary-[42]).something_else

Ответ 2

array.reject{|element| element == value_of_element_to_be_deleted}

Ответ 3

Вы можете сделать

my_array.first(n) #1

my_array.last(n) #2

Если элементы массива, который вы хотите удалить, находятся в конце (1) или в начале (2) массива.

Ответ 4

У меня был такой же вопрос для Array#delete_at, который возвратил массив с элементом с указанным индексом, поэтому я оказался здесь. Похоже, что он не встроен. В случае, если кого-то интересует, я быстро написал этот патч обезьяны (я практически не думал об эффективности, и я изначально не обрабатывал такие случаи, как отрицательные индексы или индексы за пределами... но потом я решил быстро бросить туда пару):

class Array
  def remove_at(i)
    # handle index out of bounds by returning unchanged array
    return self if i >= self.length

    # remove the i-th element from the end if i is negative
    if i < 0
      i += self.length
      # handle index out of bounds by returning unchanged array
      return self if i < 0
    end

    # Return an array composed of the elements before the specified
    # index plus the elements after the specified index
    return self.first(i) + self.last(self.length - i - 1)
  end
end

test = [0,1,2,3,4,5]
puts test.remove_at(3).inspect
puts test.remove_at(5).inspect
puts test.remove_at(6).inspect
puts test.remove_at(-7).inspect
puts test.remove_at(-2).inspect

Мне было весело взбивать это, поэтому я подумал, что могу написать его здесь:)

Ответ 5

Я предпочитаю этот способ:

list = [1, 2, 3, 4, 5]
list.tap { |list| list.delete(2) } # => [1, 3, 4, 5]

Ответ 6

an_ary.-([el]) выглядит ужасно.

Как насчет...

an_ary - [el]

?

Самый естественный способ иметь дело с математическими операциями - это...

4 - 2

Не это...

4.-(2)

Ответ 7

ОП не нравится внешний вид an_ary.-([el])... но он действительно много чего делает.

Правда... это немного некрасиво, но метод минус делает лаконично, вычитая один массив из другого:

ary = [1, 2, 99, 3]
ary.-([99])

или же

odds = [1, 3, 5, 7, 9, 99]
ary.-(odds)

Преимущество здесь в том, что он полностью цепной (в отличие от .delete или ary - odds), поэтому вы можете делать такие вещи, как:

ary.-(odds).average

Как только ваш глаз обнаружит знак минус, его будет намного легче читать, понимать и визуально определять опечатки, чем блочные конструкции .delete_if или .reject.

Это также хорошо работает с оператором безопасной навигации Ruby &. , если вы могли бы получить ноль вместо массива. Это то, что вы не можете сделать элегантно с вычитанием массивов.

maybe_array&.-(odds)&.average