scala - 如何在多模式匹配子句中绑定变量名
scala - how to bind a variable name in a multiple pattern matching clause
我想使用相同的“case
”与 2 个不同的 case classes
进行模式匹配,但我收到一个错误消息,指出绑定变量名称已在使用中:
例如这个:
statement match {
case FirstCase(a,b) => {lots of logic using "a" and "b"}
case SecondCase( obj : FirstCase, somethingElse) => {same logic as above}
...
...
}
我想重复使用相同的逻辑:
statement match {
case obj: FirstCase | SecondCase( obj : FirstCase, somethingElse) =>
{lots of logic using "obj.a" and "obj.b"}
...
...
}
但是我遇到编译错误"obj is already defined in scope"
是否可以"re-use"绑定对象的名称?
您可以使用辅助方法:
def hlp(a: TypeOfA, b: TypeOfB) = ???
statement match {
case FirstCase(a, b) => hlp(a, b)
case SecondCase(FirstCase(a, b), somethingElse) => hlp(a, b)
}
其他答案的几个备选方案:
您可以使用中间变量:
val (a,b) = statement match {
case FirstCase(a,b) => a -> b
case SecondCase(FirstCase(a,b), somethingElse) => a -> b
}
// Use a and b
您可以创建提取器对象
object AB {
def unapply(x: Any) = x match {
case FirstCase(a,b) => Some(a -> b)
case SecondCase(FirstCase(a,b), somethingElse) => Some(a -> b)
}
}
statement match {
case AB(a,b) => // use a and b here (you don't need the braces btw
}
我想使用相同的“case
”与 2 个不同的 case classes
进行模式匹配,但我收到一个错误消息,指出绑定变量名称已在使用中:
例如这个:
statement match {
case FirstCase(a,b) => {lots of logic using "a" and "b"}
case SecondCase( obj : FirstCase, somethingElse) => {same logic as above}
...
...
}
我想重复使用相同的逻辑:
statement match {
case obj: FirstCase | SecondCase( obj : FirstCase, somethingElse) =>
{lots of logic using "obj.a" and "obj.b"}
...
...
}
但是我遇到编译错误"obj is already defined in scope"
是否可以"re-use"绑定对象的名称?
您可以使用辅助方法:
def hlp(a: TypeOfA, b: TypeOfB) = ???
statement match {
case FirstCase(a, b) => hlp(a, b)
case SecondCase(FirstCase(a, b), somethingElse) => hlp(a, b)
}
其他答案的几个备选方案:
您可以使用中间变量:
val (a,b) = statement match {
case FirstCase(a,b) => a -> b
case SecondCase(FirstCase(a,b), somethingElse) => a -> b
}
// Use a and b
您可以创建提取器对象
object AB {
def unapply(x: Any) = x match {
case FirstCase(a,b) => Some(a -> b)
case SecondCase(FirstCase(a,b), somethingElse) => Some(a -> b)
}
}
statement match {
case AB(a,b) => // use a and b here (you don't need the braces btw
}