gpt4 book ai didi

scala - 模式匹配中的大量嵌套匹配...情况

转载 作者:行者123 更新时间:2023-12-03 04:15:42 27 4
gpt4 key购买 nike

我有一个自动生成的 Web 服务客户端。我有很多复杂的类,我必须对其进行模式匹配。现在我的结构如下所示:

val response = client.getResponse
response match {
case Left(_) => None
case Right(a: SomeClass) => a match {

case SomeClass2(b: Option[SomeClass3]) => b match {

case None => None
case Some(c: SomeClass3) => c match {

case SomeClass4(_, _, _, _, d: Seq[SomeClass4]) => d match {
case Nil => None

case seq: Seq[SomeClass5] => seq match {
case Nil => None
case Seq(xs@_*) => xs map { x =>
x match {
case Nil => None

case SomeClass6(e: SomeClass7) => e match {
case Nil => None

case SomeClass8(f, _, _, _, _) => f match {
case Nil => None
case Seq(xs@_*) => xs map { x =>
x match {

case Nil => None
case SomeClass9(g: Seq[SomeClass9], _, _, _, _, _, _, _, _, _, _) => /* + some nested levels more*/
}
}
}
}
}
}
}
}
}
}
}

其中 SomeClass1 - SomeClass9case 类。

正如你所看到的,这看起来很可怕。我该怎么办?让它看起来更好的标准方法是什么?

我想不仅应该进行重构,还应该采用另一种方法。

最佳答案

假设a应该是SomeClass2,但不是SomeClass(与bc相同) d)。

您可以使用替代模式,例如 case A | B => ... 和结构模式,如 Some(MyClass(f))

您还可以在 map 中使用部分函数,​​例如 map { case ... } 而不是 map { x => x match {...} }.

我猜你的代码中有一个错误:检查 case Nil => ...; case SomeClass8(...) => ....

您可以将 Seq(xs @_*) 替换为 xs。如果您需要整个集合,则无需提取元素。

您的代码:

response match {
case Left(_) | Right(SomeClass2(None)) | Right(SomeClass2(Some(SomeClass3(_, _, _, _, Nil))) => None
case Right(SomeClass2(Some(SomeClass3(_, _, _, _, xs))) =>
xs map {
case SomeClass6(None) | SomeClass6(Some(SomeClass8(Nil, _, _, _, _))) => None
case SomeClass6(Some(SomeClass8(xs, _, _, _, _))) =>
xs map {
case Nil => None
case SomeClass9(g, _, _, _, _, _, _, _, _, _, _) => /* + some nested levels more*/
}
}
}

您还应该将嵌套匹配提取到单独的方法中。

模式匹配不是唯一的解决方案。您可以使用 EitherOption 方法:

response.right.toOption.collect {
// No need for the first part.
case SomeClass2(Some(SomeClass3(_, _, _, _, xs)) if xs.nonEmpty => ...
}

关于scala - 模式匹配中的大量嵌套匹配...情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18841031/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com