他们似乎并没有很好地混合:
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")
}
问题是模式匹配和curried参数似乎不起作用。有解决办法吗?
答案 0 :(得分:12)
如果查看为B类创建的unapply函数的签名,您将看到它是:unapply(x$0: Q): Option[Int]
。因此,unapply函数适用于案例类的第一个参数范围。
scala规范(§5.3.2)证实了这一点:
案例类的第一个参数部分中的形式参数 被称为元素;他们受到特殊待遇。一,价值 这样的参数可以作为构造函数模式的字段提取。
它明确声称只有第一个参数部分可通过提取器获得。
几种解决方法:
case x@B(3) if x.b == "bazinga" => ...
答案 1 :(得分:7)
这有什么问题?
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)
但是当你对狗进行模式匹配时,构造函数模式是而不是 curried。
Dog("Snoopy")(10) match {
case Dog(a, b) => // do sth with a or b
}
答案 2 :(得分:2)
您可以使用普通的案例类,只需定义一个带有多个参数列表的工厂方法。