2015-10-18 3 views
0

Вот пример из книги трапа:Какой смысл получить «Префиксную карту» и вернуть пустую «Префиксную карту»?

object Example1 { 

    import collection._ 

    class PrefixMap[T] 
    extends mutable.Map[String, T] 
    with mutable.MapLike[String, T, PrefixMap[T]] { 
    var suffixes: immutable.Map[Char, PrefixMap[T]] = Map.empty 
    var value: Option[T] = None 

    def get(s: String): Option[T] = { 
     // base case, you are at the root 
     if (s.isEmpty) value 
     // recursive 
     else suffixes get (s(0)) flatMap (_.get(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 -=(key: String): this.type = { 
     remove(key) 
     this 
    } 


    def withPrefix(s: String): PrefixMap[T] = { 
     if (s.isEmpty) this 
     else { 
     val leading = s(0) 
     suffixes get leading match { 
      case None => { 
      // key does not exist, create it 
      suffixes = suffixes + (leading -> empty) 
      } 
      case _ => 
     } 
     // recursion 
     suffixes(leading) withPrefix (s substring 1) 
     } 
    } 

    override def update(s: String, elem: T) = { 
     withPrefix(s).value = Some(elem) 
    } 

    override def remove(key: String): Option[T] = { 
     if (key.isEmpty) { 
     // base case. you are at the root 
     val prev = value 
     value = None 
     prev 
     } else { 
     // recursive 
     suffixes get key(0) flatMap (_.remove(key substring 1)) 
     } 
    } 

    override def empty = PrefixMap.empty 
    } 

    import collection.mutable.{Builder, MapBuilder} 
    import collection.generic.CanBuildFrom 

    object PrefixMap { 
    def empty[T] = new PrefixMap[T] 
    def apply[T](kvs: (String, T)*): PrefixMap[T] = { 
     val m: PrefixMap[T] = empty 
     for(kv <- kvs) m += kv 
     m 
    } 
    def newBuilder[T]: Builder[(String, T), PrefixMap[T]] = { 
     new mutable.MapBuilder[String, T, PrefixMap[T]](empty) 
    } 

    implicit def canBuildFrom[T]: CanBuildFrom[PrefixMap[_], (String, T), PrefixMap[T]] = { 
     new CanBuildFrom[PrefixMap[_], (String, T), PrefixMap[T]] { 
     def apply(from: PrefixMap[_]) = newBuilder[T] 
     def apply() = newBuilder[T] 
     } 
    } 
    } 

} 

Я не понимаю эту линию: точка

 def apply(from: PrefixMap[_]) = newBuilder[T] 

Что в получении PrefixMap и возвращает пустую PrefixMap?

ответ

0

Читать немного больше official docs

Если коротко: CBF может вернуться строитель со знанием свойств всей коллекции.
Например, он может инициализировать некоторый буфер необходимого размера для сбора записей.
Или даже повторное использование некоторых частей коллекции известного типа и структуры.

Но по умолчанию во многих случаях он просто собирал элемент за элементом в пустую коллекцию. Это происходит в вашем случае.

Смежные вопросы