我遇到了一个我自己无法解决的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的编码
答案 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!"