它们似乎不太混合:
abstract class A
case class B (var a: Int)(var b: String) extends A
case class C extends A
以下方法是行不通的:B(1)("1") match {
case B(a)(b) => print("B")
case C() => print("C")
}
问题在于模式匹配和柯里化参数似乎不起作用。有没有解决这个问题的方法?
它们似乎不太混合:
abstract class A
case class B (var a: Int)(var b: String) extends A
case class C extends A
以下方法是行不通的:B(1)("1") match {
case B(a)(b) => print("B")
case C() => print("C")
}
问题在于模式匹配和柯里化参数似乎不起作用。有没有解决这个问题的方法?
unapply(x$0: Q): Option[Int]
。因此,unapply函数与case类的第一组参数一起工作。case x@B(3) if x.b == "bazinga" => ...
def m(a: A) = a match {
case b: B => print("B")
case c: C => print("C")
}
我之所以问这个问题,是因为你没有要求比这更多的功能。
编辑
这可能会有所帮助:
object Dog {
def apply(name: String)(size: Int) = new Dog(name)(size)
def unapply(dog: Dog) = Some(dog.name, dog.size)
}
class Dog(val name: String)(var size: Int)
现在您可以像这样创建狗:
new Dog("Snoopy")(10)
Dog("Snoopy")(10)
但是,当你在狗上进行模式匹配时,构造函数模式不是柯里化的。
Dog("Snoopy")(10) match {
case Dog(a, b) => // do sth with a or b
}
您可以使用普通的case类,并定义一个带有多个参数列表的工厂方法。
apply
。 - Nicolas