Единственный способ удалить!элементы из массива по предикату и возвращению удалены - PullRequest
0 голосов
/ 04 июля 2019

Я не смог найти метод в документах, чтобы сделать следующее:

a = [1, 2, 3]
b = a.remove! {|x| x > 1}
puts a # [1]
puts b # [2, 3]

Существует select! метод, который делает похожую вещь, но не принимает предикат. К моему разочарованию, delete_if, keep_if, reject! и select! изменяют массив, но также возвращают тот же массив.

В настоящее время я достигаю желаемого за 2 шага, как это, но, может быть, есть варианты лучше / умнее?

a = [1, 2, 3]
b = a.reject {|x| x > 1}
a = a - b
puts a # [1]
puts b # [2, 3]

1 Ответ

4 голосов
/ 04 июля 2019

Я не знаю, как сделать это за 1 шаг, однако если, как и во втором примере, вы согласитесь не мутировать a из метода ruby, вы можете использовать Enumerable # partition

a = [1, 2, 3]

# note that b is first because first array is for elements returning true
b, a = a.partition { |x| x > 1 }

puts a # [1]
puts b # [2, 3]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...