Конструктор не может быть создан для ожидаемого типа; p @ Person
Я использую версию 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))
Что я здесь не так делаю?
2 ответа
Решение
Информация об ошибке ясна
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
Ошибка в том, что ваше соответствие на 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))
}