Похоже, вы в замешательстве. a -= 2
не удаляет элемент 2. Если это возможно, тогда a
будет, по определению, набором mutable , поскольку вы его изменяете. a -= 2
создает новый набор, который выглядит как старый, и присваивает его переменной a
. Как ite
должен волшебным образом знать, что это произошло?
Ответ таков: нет, если он уже запущен. То есть, на самом деле, весь смысл в использовании неизменных структур данных. Если кто-то решит, что мир теперь выглядит по-другому, вас не смущает - вы продолжаете работать над своей старой копией, которая выглядит так же, как и раньше.
Но если итератор еще не уже использовался, и вам просто нужна удобная метка, означающая "получить итератор a", вы можете
var a = Set(1,2,3,4,5)
val ite = () => a.iterator
a -= 2
ite().foreach(println) // Prints 5,1,3,4 or the like--no 2
Здесь ite
- это не переменная, это функция, которая оказывается замыканием a.iterator
. Он вызывает a.iterator
каждый раз, когда вы его используете, поэтому он всегда актуален (по крайней мере, на начальном этапе). Вы также можете создать ленивый итератор, который фактически не выбирает, какую версию a
использовать, пока она не понадобится:
var a = Set(1,2,3,4,5)
lazy val ite = a.iterator // Not a.iterator now, but will be when we need it!
a -= 2
ite.foreach(println) // Need it now--so we'll get 5,1,3,4
Обратите внимание, что в этом случае, если вы вызываете метод, который принимает итератор, ite будет установлен, когда он будет передан функции. Предыдущая версия, которая принимает функцию, возвращающую итератор, создаст итератор только один раз.
Теперь вам может потребоваться итератор, который может работать с удаленными записями, просматривая текущее значение a
. Вы также можете сделать это, но это легче реализовать, если удаленные результаты возвращаются None
, а восстановленные возвращаются Some(x)
:
var a = Set(1,2,3,4,5)
val ite = new Iterator[Option[Int]] {
private val it = a.iterator
def hasNext = it.hasNext
def next = {
val i = it.next
if (a(i)) Some(i) else None
}
}
a -= 2
ite.foreach(println) // Some(5),Some(1),None,Some(3),Some(4)
(В противном случае вам придется кэшировать значения, так как hasNext
в этом итераторе нужно будет вызвать next
в итераторе a
, чтобы он мог проверить, существует ли этот элемент еще.)
В любом случае, есть много вариантов, но вам нужно решить, какой разумный поступок вы действительно хотите сделать.