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;
}

我得到的错误是:

错误:模式类型与预期类型不兼容;found : String required: Unit case y:String => ("\"" + y + "\"")

知道为什么吗?

PS:是否有更高效的方式来编写 myFunction

4

2 回答 2

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& mkString)组合成一个遍历。

于 2010-06-15T23:43:34.150 回答
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!"
于 2010-06-15T23:18:00.063 回答