0

これを行うと、コンパイラは「パラメータタイプがありません」と言っていますp

case class MapResult(input: Any, output: Map[_ <: Any, Any]) {
  override def toString = output.map(p => input + " " + p._1 + " " + p._2 ).mkString("\n")
}    

それから教えてくれる

identifier expected but string literal found.
[error]   override def toString = output.map(p: (Any, Any) => input + " " + p._1 + " " + p._2 ).mkString("\n")
                                                                      ^

以下の場合:

case class MapResult(input: Any, output: Map[_ <: Any, Any]) {
      override def toString = output.map(p: (Any, Any) => input + " " + p._1 + " " + p._2 ).mkString("\n")
    }
4

1 に答える 1

2

関数リテラルで型パラメーターの型を指定したらすぐに、括弧の代わりに中括弧を使用する必要があります。

case class MapResult(input: Any, output: Map[_ <: Any, Any]) {
  override def toString = output.map{p: (Any, Any) => input + " " + p._1 + " " + p._2 }.mkString("\n")
}

更新: パラメータ リストを括弧で囲むこともできます。これにより、中括弧がなくてもパーサーを満足させることができます。

case class MapResult(input: Any, output: Map[_ <: Any, Any]) {
  override def toString = output.map( (p: (Any, Any)) => input + " " + p._1 + " " + p._2 ).mkString("\n")
}

ここでは、パターン マッチングも使用できます。

case class MapResult(input: Any, output: Map[_ <: Any, Any]) {
  override def toString = output.map{ case (k: Any, v: Any) => input + " " + k + " " + v }.mkString("\n")
}

コンパイラがここでパラメーターの型を指定することを強制する理由については、正直なところわかりません。scala 2.10-RC1 では再現できませんでした。

于 2012-11-14T08:07:26.353 に答える