[scala] 특이한 Iterator

scala 2016. 10. 19. 11:35


스칼라의 Iterator는 불변이 아닌 가변(mutable)이다.  마치 포인터처럼 내부 인덱스을 가지고 있기 때문에 잘 알아야 할 필요가 있다. 


object Main extends App {
val list = List(1, 2, 3, 4, 5, 6)
val it = list.iterator
println(it.hasNext)
println(it.next)
println(it.next)
println(it.hasNext)
println(it.size)
println(it.hasNext)
println(it.size)
println(it.hasNext)
}

결과는 다음과 같다.


true

1

2

true

4

false

0

false




size를 호출한 이후, 완전히 이상해져버렸다. 



코드로 설명해본다. ^은 리스트의 인덱스를 가르킨다. 

size를 호출하면, 인덱스가 계산 후 끝으로 가버린다. 남은 크기를 리턴하지. 젙체 크기를 리턴하지 않는다. 


val list = List(1, 2, 3, 4, 5, 6)
val it = list.iterator
println(it.hasNext) // ^ 1 2 3 4 5 6
println(it.next) // 1 ^ 2 3 4 5 6
println(it.next) // 1 2 ^ 3 4 5 6
println(it.hasNext)
println(it.size) // 1 2 3 4 5 6 ^
println(it.hasNext) // false
println(it.size) // 0
println(it.hasNext) // false



문서에 보면, next와 hasNext를 제외하고는 Iterator 내부의 값이 바뀔 수 있다고 한다. 




http://www.scala-lang.org/api/current/index.html#scala.collection.Iterator

It is of particular importance to note that, unless stated otherwise, one should never use an iterator after calling a method on it. The two most important exceptions are also the sole abstract methods: next and hasNext.



Posted by '김용환'
,