Массив # удалить, но вернуть массив? - PullRequest
25 голосов
/ 07 апреля 2011

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

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

Ответы [ 7 ]

37 голосов
/ 07 апреля 2011

Если вы хотите изменить исходный массив, например 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
4 голосов
/ 27 апреля 2014
array.reject{|element| element == value_of_element_to_be_deleted}
1 голос
/ 09 марта 2019

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

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

an_ary - [el]

?

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

4 - 2

Не это ...

4.-(2)
1 голос
/ 29 января 2018

Я предпочитаю так:

list = [1, 2, 3, 4, 5]
list.tap { |list| list.delete(2) } # => [1, 3, 4, 5]
1 голос
/ 14 июля 2017

У меня был такой же вопрос для 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

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

1 голос
/ 07 января 2017

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

my_array.first(n) #1

my_array.last(n) #2

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

0 голосов
/ 20 июня 2019

ОП не нравится внешний вид 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 &., если вы можете получить nil вместо массива.Это то, что вы не можете сделать элегантно с вычитанием массивов.

maybe_array&.-(odds)&.average
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...