2010-06-15 113 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!" 
相關問題