스칼라 컬렉션의 아키텍처 스칼라 프로그래밍, 제 3 판 프로그래밍에서 PrefixMap 예제를 실행하면 업데이트를 호출 할 때 상속 된 PrefixMap 맵을 업데이트하는 것이 이해가 안됩니다.상속 된 PrefixMap 맵은 무엇이 업데이트됩니까?
import collection._
class PrefixMap[T]
extends mutable.Map[String, T]
with mutable.MapLike[String, T, PrefixMap[T]] {
val id: Long = PrefixMap.nextId
var suffixes: immutable.Map[Char, PrefixMap[T]] = Map.empty
var value: Option[T] = None
def get(s: String): Option[T] =
if (s.isEmpty) value
else suffixes get s(0) flatMap (_.get(s substring 1))
def withPrefix(s: String): PrefixMap[T] =
if (s.isEmpty) this
else {
val leading = s(0)
suffixes get leading match {
case None =>
suffixes = suffixes + (leading -> empty)
case _ =>
}
val ret = suffixes(leading) withPrefix (s substring 1)
println("withPrefix: ends with: id="+this.id+", size="+this.size+", this="+this)
ret
}
override def update(s: String, elem: T) = {
println("update: this before withPrefix: id="+this.id+", size="+this.size+", return="+this)
val pm = withPrefix(s)
println("update: withPrefix returned to update: id="+pm.id+", size="+pm.size+", return="+pm)
println("===> update: this after withPrefix and before assignment to pm.value : id="+this.id+", size="+this.size+", return="+this)
pm.value = Some(elem)
println("===> update: this after assinment to pm.value: id="+this.id+", size="+this.size+", return="+this)
}
override def remove(s: String): Option[T] =
if (s.isEmpty) { val prev = value; value = None; prev }
else suffixes get s(0) flatMap (_.remove(s substring 1))
def iterator: Iterator[(String, T)] =
(for (v <- value.iterator) yield ("", v)) ++
(for ((chr, m) <- suffixes.iterator;
(s, v) <- m.iterator) yield (chr +: s, v))
def += (kv: (String, T)): this.type = { update(kv._1, kv._2); this }
def -= (s: String): this.type = { remove(s); this }
override def empty = new PrefixMap[T]
}
object PrefixMap {
var ids: Long = 0
def nextId: Long = { PrefixMap.ids+=1; ids }
}
object MyApp extends App {
val pm = new PrefixMap[Int]
pm.update("a", 0)
println(pm)
}
출력은 :
업데이트이 withPrefix 전 : 여기서 는 코드 ID = 1, 크기 = 0, = 복귀 맵()
withPrefix : ID : 끝나는 = 1, 크기 = 0이 맵()
업데이트 = withPrefix 업데이트 반환 이드 = 2, 사이즈 = 0을 반환 = 맵()
===> 업데이트이 withPrefix 후 과제 t 전에 id = 1, size = 1, return = Map (a - pm.value : id = 1, size = 0, return = Map()
업데이트 : > 0)
지도 (A -> 0)
그래서 질문은 :이 업데이트 방법 "pm.value = 일부 (ELEM)"와 라인의 상속지도 발생 가능성이 방법 PrefixMap을 (a -> 0)으로 업데이트 하시겠습니까?
고맙습니다. 감사합니다. "PrefixMap의 상속 된 맵"으로 참조하는 맵 (접미사)과 대비하여 PrefixMap을 자체적으로 맵으로 의미했습니다. 내가 주로 빠뜨린 부분은 iteraror 구현을 이해하는 것이고, 그 때문에 간단한 값 할당이 PrefixMap에서 키 값 매핑을 만들었다는 사실에 놀랐습니다. 명확한 설명에 감사드립니다. – Shay