Scala 使用变量绑定的替代模式匹配?
我尝试在术语上实现一个等价关系,我也想与一些模式匹配。然而,我的关系是对称的,因此,模式匹配也必须反映这一点 请看以下示例:Scala 使用变量绑定的替代模式匹配?,scala,Scala,我尝试在术语上实现一个等价关系,我也想与一些模式匹配。然而,我的关系是对称的,因此,模式匹配也必须反映这一点 请看以下示例: abstract class Term case class Constructor(txt:String) extends Term case class Variable(txt:String) extends Term case class Equality(t1:Term, t2:Term) def foobar(e:Equality) = e match {
abstract class Term
case class Constructor(txt:String) extends Term
case class Variable(txt:String) extends Term
case class Equality(t1:Term, t2:Term)
def foobar(e:Equality) = e match {
case Equality(Variable(x),Constructor(y)) => "do something rather complicated with x and y"
case Equality(Constructor(y),Variable(x)) => "do it all over again"
}
事实上,我想做这样的事情
def foobar(e:Equality) = e match {
case Equality(Variable(x),Constructor(y)) | Equality(Constructor(y),Variable(x))
=> "yeah! this time we need to write the code only one time ;-)"
}
但是,如中所述,这是不允许的。有人有解决这类问题的好办法吗?非常感谢任何帮助/指针。您可以创建自己的unapply方法,如下所示:
object CVEquality {
def unapply(e: Equality): Option(String, String) = e match {
case Equality(Variable(v), Constructor(c)) => Some(c -> v)
case Equality(Constructor(c), Variable(v)) => Some(c -> v)
case _ => None
}
}
用法:
def foobar(e:Equality) = e match {
case CVEquality(c, v) => "do something rather complicated with c and v"
}
最简单的方法是为相当复杂的创建方法:
def complicated(c: String, v: String) = "do something rather complicated with c and v"
def foobar(e:Equality) = e match {
case Equality(Variable(x),Constructor(y)) => complicated(y, x)
case Equality(Constructor(y),Variable(x)) => complicated(y, x)
}
我怀疑我必须像你的回答中描述的那样去做,但希望有一个简单的解决方案:无论如何,我更喜欢你的第二个想法,因为我希望编译器使用回溯,即如果有几十个其他case语句,则生成更有效的代码。