2010-06-15 88 views
4

我遇到了我自己无法解决的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; 
} 

我得到的错误是:

错误:模式类型与预期的类型不兼容; 发现:字符串 需要:单位 情况下,y:字符串=>( “\” “+ Y + ”\“”)

知道为什么?

PS:有代码myFunction的

回答

7

在原来的问题方面,该代码不ç由于它需要在比赛周围使用括号,所以称为ompile。 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 & mkString)合并成一次遍历,就知道了我的头脑。

+3

使用'view'会将'map'&'mkString'变成一次遍历。 – 2010-06-16 01:16:17

0

这里更高性能的方式是你的代码的形式,以更简洁形式一起编译(W/O为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!" 
相关问题