为什么我得到“模式类型与预期类型不兼容”?

时间:2010-06-15 22:48:51

标签: scala match

我遇到了一个我自己无法解决的Scala代码错误(我是Scala的新手)。 我有以下代码:

def myFunction(list: List[Any]): String = {
  var strItems : String = "";
  list.foreach(item => {
    strItems += item match {
      case x:JsonSerializable => x.toJson()
      case y:String => ("\"" + y + "\"")
      case _ => item.toString
    }
    if(item != list.last)
      strItems +=  ",";
  })
  strItems;
}

我得到的错误是:

错误:模式类型与预期类型不兼容; 发现:字符串 要求:单位 case y:String => (“\”“+ y +”\“”)

知道为什么吗?

PS:是否有更高效的代码来实现myFunction的编码

2 个答案:

答案 0 :(得分:7)

就原始问题而言,代码无法编译,因为它需要围绕匹配的括号,即。 strItems += (item match { ... })

更具“功能性”的写作方式可能类似于:

def myFunction(list:List[Any]):String = {
  val strings:List[String] = list.map{
    case x:JsonSerializable => x.toJson()
    case y:String => ("\"" + y + "\"")
    case z => z.toString
  }
  strings.mkString(",")
}

你可能会使用一个视图使它变得懒惰而且更“高效”,尽管我不知道如果那会结合两个底层循环(map& {{1进入单个遍历。

答案 1 :(得分:0)

这是你的代码的一种形式,它编译(没有JsonSerializable的任何定义)(在Scala 2.8中)以及更简洁的公式(也恰好是无点的):

object Javier01 {
  def
  javFunc(list: List[Any]): String = {
    val strItems = new StringBuilder()

    list.foreach { item =>
      strItems.append ( item match {
//      case x: JsonSerializable => x.toJson()
        case y: String => "\"" + y + "\""
        case _ => item.toString
      } )

      if (item != list.last)
        strItems.append(",")
    }
    strItems.toString
  }

  def
  rrsFunc(anys: List[Any]): String =
    anys map {
//    case x: JsonSerializable => x.toJson()
      case s: String => "\"" + s + "\""
      case x => x.toString
    } mkString ","


  def
  main(args: Array[String]): Unit = {
    val stuff = List(true, 1, 123.456, "boo!")

    printf("        stuff : %s%njavFunc(stuff): %s%nrrsFunc(stuff): %s%n%n",
           stuff, javFunc(stuff), rrsFunc(stuff))
  }
}

运行它的输出是:

% scala Javier01
        stuff : List(true, 1, 123.456, boo!)
javFunc(stuff): true,1,123.456,"boo!"
rrsFunc(stuff): true,1,123.456,"boo!"