scala - Scala中的嵌套与展平模式匹配
问题描述
假设我在 Scala中有n 个名为v 1 , v 2 , ..., vi , ..., v n的类型T ij的值,对于不同的i,它们不一定是不同的类型。我想使用自定义逻辑对n 个值进行模式匹配。
一种方法是嵌套所有可能性,以防我需要详尽无遗(为了这个例子,我需要这样做,否则我可以使用占位符 mag _
c)并且我不能合并分支(为了这个例子我不能因为每个自定义逻辑都是唯一的):
v1 match {
case x1: T11 => v2 match {
case x2: T21 => v3 match {
...
case xn_1: Tn_11 => vn match {
case xn: Tn1 => // Custom logic 1.
case xn: Tn2 => // Custom logic 2.
...
case xn: Tnk => // I am already laughing, but I have to write it down:
// Custom logic k.
}
...
...
}
case x2: T22 => v3 match {
// I guess you get the point.
}
...
case x1: T12 => v2 match {
// And so on until exhaustion in every meaning of the word.
}
... // These three dots are needed here. Now I feel whole.
}
另一种选择是将整个该死的东西展平:
(v1, v2, ..., vn) match {
case (x1: T11, x2: T21, ... xn: Tn1) => // Custom logic 1.
case (x1: T11, x2: T21, ... xn: Tn2) => // Custom logic 1.
...
case (x1: T11, x2: T21, ... xn: Tnk) => // Custom logic k (with a hearthy chuckle).
... // Three dots saving my soul and my finger joints.
}
虽然嵌套版本避免了重复输入,但当n很高(而我们不是)时,由于缩进溢出,它可能导致难以阅读的代码。
另一方面,扁平化版本包含大量重复代码,但更容易解释。
此外,嵌套版本似乎更高效,因为每个类型T ij最多对x i进行一次检查(但也许我不应该关心诸如 JVM 可以完全优化它的事情,我不想都是邪恶的)。
哪一个是惯用的 Scala 代码,因此值得推荐?两个版本之间有性能差异吗?
解决方案
您应该选择最能表达代码含义的选项,而不用担心性能。如果它的性能match
对您的代码至关重要,那么您的设计就会遇到更大的问题。(也不清楚一个性能优于另一个,因此基于假设性能进行选择是不明智的)。
如果每个都case
导致一段独立的代码,那么有一个平面match
是最直接的逻辑表达。添加虚假嵌套只会使事情变得混乱。
如果两个或多个表达式之间有一些公共代码,case
则可以将它们分组到嵌套match
语句中,这样公共代码就不会重复。如果您想在代码中表达的多个案例之间存在一些逻辑共性,这也可能适用。
另请注意,您可以链接部分函数,使用orElse
它可以将一个大函数拆分match
为具有有意义名称的单独函数,同时避免嵌套match
语句。
推荐阅读
- unity3d - 在 Unity 的 vfx 图中找不到现有节点
- c# - C# 使用 wuapi 安装 Windows 10 功能更新
- android - Android DefaultHttpClient、HttpPost 等已弃用 (SDK 30)
- python - 转换和求和熊猫数据框列内嵌套列表中的元素
- helidon - 在 WSL 上安装 Helidon
- c++ - 将一个用户定义的类转换为另一个用户定义的类时出现问题
- java - 记录应用洞察的正确方法是什么?
- java - Spring Security 使用过滤器而不是控制器
- python - Spark 广播经过训练的 tensorflow SavedModel
- ocr - 有没有办法让 textract 将 pdf 图像呈现为 excel 数据表?