String 如何在类似列表的模式匹配中使用scala字符串

String 如何在类似列表的模式匹配中使用scala字符串,string,scala,generics,implicit,trie,String,Scala,Generics,Implicit,Trie,所以我在读scala是如何通过其隐式机制将字符串作为字符序列处理的。我为通用元素类型创建了一个泛型Trie类,并希望使用它的基于字符的实现和类似字符串的语法 import collection.mutable import scala.annotation.tailrec case class Trie[Elem, Meta](children: mutable.Map[Elem, Trie[Elem, Meta]], var metadata: Option[Meta] = None) {

所以我在读scala是如何通过其隐式机制将字符串作为字符序列处理的。我为通用元素类型创建了一个泛型Trie类,并希望使用它的基于字符的实现和类似字符串的语法

import collection.mutable
import scala.annotation.tailrec

case class Trie[Elem, Meta](children: mutable.Map[Elem, Trie[Elem, Meta]], var metadata: Option[Meta] = None) {

  def this() = this(mutable.Map.empty)
  @tailrec
  final def insert(item: Seq[Elem], metadata: Meta): Unit = {
    item match {
      case Nil =>
        this.metadata = Some(metadata)
      case x :: xs =>
        children.getOrElseUpdate(x, new Trie()).insert(xs, metadata)
    }
  }

  def insert(items: (Seq[Elem], Meta)*): Unit = items.foreach { case (item, meta) => insert(item, meta) }

  def find(item: Seq[Elem]): Option[Meta] = {
    item match {
      case Nil => metadata
      case x :: xs => children.get(x).flatMap(_.metadata)
    }
  }
}


object Trie extends App {
  type Dictionary = Trie[Char, String]
  val dict = new Dictionary()

  dict.insert( "hello", "meaning of hello")
  dict.insert("hi", "another word for hello")
  dict.insert("bye", "opposite of hello")
  println(dict)
}
奇怪的是,它编译得很好,但运行时出错:

Exception in thread "main" scala.MatchError: hello (of class scala.collection.immutable.WrappedString)
    at Trie.insert(Trie.scala:11)
    at Trie$.delayedEndpoint$com$inmobi$data$mleap$Trie$1(Trie.scala:34)
    at Trie$delayedInit$body.apply(Trie.scala:30)
    at scala.Function0$class.apply$mcV$sp(Function0.scala:34)
    at scala.runtime.AbstractFunction0.apply$mcV$sp(AbstractFunction0.scala:12)
    at scala.App$$anonfun$main$1.apply(App.scala:76)
    at scala.App$$anonfun$main$1.apply(App.scala:76)
    at scala.collection.immutable.List.foreach(List.scala:381)
    at scala.collection.generic.TraversableForwarder$class.foreach(TraversableForwarder.scala:35)
    at scala.App$class.main(App.scala:76)
    at Trie$.main(Trie.scala:30)
    at Trie.main(Trie.scala)
它能够隐式地将字符串转换为WrappedString,但这与::不匹配。有什么解决办法吗

您可以使用startsWith,如下所示:

val s = "ThisIsAString"
s match {
   case x if x.startsWith("T") => 1
   case _ => 0
}
或者使用toList将字符串转换为字符列表

然后将其用作任何其他列表


insert方法将项声明为Seq,但模式匹配只匹配列表中的项。字符串可以隐式转换为Seq[Char],但它不是列表。在Seq上使用模式匹配,而不是使用+:

这同样适用于find方法

scala>     val s = "ThisIsAString"
s: String = ThisIsAString

scala> s.toList
res10: List[Char] = List(T, h, i, s, I, s, A, S, t, r, i, n, g)
s.toList match {
  case h::t => whatever
  case _ => anotherThing
}
  @tailrec
  final def insert(item: Seq[Elem], metadata: Meta): Unit = {
    item match {
      case Seq() =>
        this.metadata = Some(metadata)
      case x +: xs =>
        children.getOrElseUpdate(x, new Trie()).insert(xs, metadata)
    }
  }