Scala冗余模式匹配
如何使此代码段更高效Scala冗余模式匹配,scala,pattern-matching,Scala,Pattern Matching,如何使此代码段更高效 v match { case y @ A(x) => val x = if (mapping.contains(y)) mapping.get(y) else v x match { case y @ A(i) => lookup(y) } } 我觉得通过声明一个val来检索mapping.get(y),两个模式匹配器的使用可能会减少到一个,但每次我尝试这样做时,都会出现一
v match {
case y @ A(x) =>
val x = if (mapping.contains(y))
mapping.get(y)
else
v
x match {
case y @ A(i) =>
lookup(y)
}
}
我觉得通过声明一个val来检索mapping.get(y),两个模式匹配器的使用可能会减少到一个,但每次我尝试这样做时,都会出现一个非法的简单表达式错误:
v match {
case y @ A(x) =>
val x = if (mapping.contains(y))
val x = mapping.get(y) //Causes an error
lookup(x)
else
v
}
我假设
映射
是一个映射
?如果是,请使用getOrElse
:
val x = mapping.getOrElse(y, v)
在第二个代码块中,需要在if
中的两条语句周围加上大括号
但是你的代码没有多大意义。有几个原因:
- 您有
,它为case y@A(x)
赋值。但是,紧接着,您就有了x
,这意味着您分配了一个全新的x=
,与旧的x
x相去甚远
- 类似地,您有
,但不使用case y@A(i)
i
语句都没有多个match
。如果匹配失败,这将导致运行时错误。但是如果你知道它不会失败,那么这场比赛就没有什么用处了李>大小写
映射
是一个映射
?如果是,请使用getOrElse
:
val x = mapping.getOrElse(y, v)
在第二个代码块中,需要在if
中的两条语句周围加上大括号
但是你的代码没有多大意义。有几个原因:
- 您有
,它为case y@A(x)
赋值。但是,紧接着,您就有了x
,这意味着您分配了一个全新的x=
,与旧的x
x相去甚远
- 类似地,您有
,但不使用case y@A(i)
i
语句都没有多个match
。如果匹配失败,这将导致运行时错误。但是如果你知道它不会失败,那么这场比赛就没有什么用处了李>大小写
- 考虑
考虑mapping.getOrElse(y,v) match { case z @ A(i) => lookup(z) case _ => somethingElse }
mapping.getOrElse(y,v) match { case z @ A(i) => lookup(z) case _ => somethingElse }
请注意@dhg对查询代码的指导性意见。请注意@dhg对查询代码的指导性意见。