构造函数不能实例化为预期类型; 2P @人
问题描述:
我使用Scala的版本:Scala code runner version 2.9.2-unknown-unknown -- Copyright 2002-2011, LAMP/EPFL
构造函数不能实例化为预期类型; 2P @人
我试图深的情况下匹配从这里构造: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))
我在这里做错了什么?
答
错误信息是明确的
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(([email protected](_,_,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
+0
你好,Eastsun!感谢您的回答:)请在上面发布的问题中查看我的评论? – tuxdna 2013-02-25 07:48:58
答
这个错误是因为你对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 [email protected](_,_,Manager)=>println("%s is overpaid".format(p);
case p:Person =>println("%s is underpaid".format(p.toString))
}
任何想法是将 'ID' 的case语句的目的是什么?也许它与旧的Scala语法有关? – tuxdna 2013-02-25 07:47:27