构造函数不能实例化为预期类型; 2P @人

构造函数不能实例化为预期类型; 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)) 

我在这里做错了什么?

+0

任何想法是将 'ID' 的case语句的目的是什么?也许它与旧的Scala语法有关? – tuxdna 2013-02-25 07:47:27

错误信息是明确的

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)) 
} 
+0

你好korefn!谢谢你的回答。这真的有帮助:) – tuxdna 2013-02-25 07:50:42

+0

欢迎您@tuxdna – korefn 2013-02-25 09:51:41