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