7

私はscalaバージョンを使用しています:Scala code runner version 2.9.2-unknown-unknown -- Copyright 2002-2011, LAMP/EPFL

私はここからディープケースマッチング構造を試していました: http://ofps.oreilly.com/titles/9780596155957/RoundingOutTheEssentials.htmlとコードは次のとおりmatch-deep.scalaです:

class Role
case object Manager extends Role
case object Developer extends Role

case class Person(name:String, age: Int, role: Role)

val alice = new Person("Alice", 25, Developer)
val bob = new Person("Bob", 32, Manager)
val charlie = new Person("Charlie", 32, Developer)

for( person <- List(alice, bob, charlie) ) {
  person match {
    case (id, p @ Person(_, _, Manager)) => println("%s is overpaid".format(p))
    case (id, p @ Person(_, _, _)) => println("%s is underpaid".format(p))
  }
}

次のエラーが表示されます。

match-deep.scala:13: error: constructor cannot be instantiated to expected type;
 found   : (T1, T2)
 required: this.Person
    case (id, p @ Person(_, _, Manager)) => println("%s is overpaid".format(p))
         ^
match-deep.scala:13: error: not found: value p
    case (id, p @ Person(_, _, Manager)) => println("%s is overpaid".format(p))
                                                                            ^
match-deep.scala:14: error: constructor cannot be instantiated to expected type;
 found   : (T1, T2)
 required: this.Person
    case (id, p @ Person(_, _, _)) => println("%s is underpaid".format(p))
         ^
match-deep.scala:14: error: not found: value p
    case (id, p @ Person(_, _, _)) => println("%s is underpaid".format(p))

ここで何が間違っていますか?

4

2 に答える 2

4

エラー情報がわかりやすい

for( person <- List(alice, bob, charlie) ) {
  person match {
    case p @ Person(_, _, Manager) => println("%s is overpaid".format(p.toString))
    case p @ Person(_, _, _) => println("%s is underpaid".format(p.toString))
  }
}

同じことを行う簡単な方法を次に示します。

for(p @ Person(_, _, role) <- List(alice, bob, charlie) ) {
  if(role == Manager) println("%s is overpaid".format(p.toString))
  else println("%s is underpaid".format(p.toString))
}

編集あなた の本当の意味がid何を望んでいたのかわかりませんが、それはindexリストに載っている人のことだと思います。どうぞ:

scala> for((p@Person(_,_,role), id) <- List(alice, bob, charlie).zipWithIndex ) {
     |   if(role == Manager) printf("%dth person is overpaid\n", id)
     |   else printf("Something else\n")
     | }
Something else
1th person is overpaid
Something else
于 2013-02-21T06:58:41.893 に答える
3

エラーは、あなたのマッチングがpersonタプルではないためです(id,person)

person match{
  case p @ Person(_, _, Manager)) => println("%s is overpaid".format(p)
  case p : Person => println("%s is underpaid".format(p.toString))
}

これで十分です。

編集

foreachこれを簡単に使用できるように適応させることができます

List(alice, bob, charlie) foreach {
    case p@Person(_,_,Manager)=>println("%s is overpaid".format(p);
    case p:Person =>println("%s is underpaid".format(p.toString)) 
}
于 2013-02-21T07:35:10.030 に答える