Удалить опцию из mutable.Buffer

63
6

Существует метод headOption который возвращает Option[T] главы коллекции.

Я хотел бы иметь что-то вроде removeOption(n: Int) возвращающее и удаляющее n-й элемент, если он находится в диапазоне коллекции иначе ничего не делает и возвращает None.

Я могу сделать это с помощью сопоставления с образцом, но это кажется слишком грязным. Может быть, implicit class es поможет здесь?

Actualyl Я пробовал:

 implicit class RemoveOptionImplicit[A](val t: mutable.Buffer[A]) extends AnyVal {
def removeOption(index: Int) =
if(index >= 0 & index < t.size)
Some(t.remove(index))
else
None
}

Но не уверен, что это хороший способ.

спросил(а) 2021-01-25T15:22:52+03:00 4 месяца, 3 недели назад
1
Решение
99

Как насчет этого?

import scala.util.Try
def safeRemove[A](mb: collection.mutable.Buffer[A], idx: Int): Option[A] =
Try(mb.remove(idx)).toOption

У этого есть неприятный побочный эффект мутации Buffer, если индекс хорош, но я думаю, что вы просили.

Если вы предпочитаете не разбираться с исключениями, ваша оригинальная идея может быть упрощена так.

def safeRemove[A](mb: collection.mutable.Buffer[A], idx: Int): Option[A] =
if (mb.isDefinedAt(idx)) Option(mb.remove(idx))
else None

Конечно, сутенерство методов mutable.Buffer через неявное преобразование всегда возможно.

ответил(а) 2021-01-25T15:22:52+03:00 4 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема