Nil 和 List 作为 Scala 中的 case 表达式

2024-03-15

此代码编译:

def wtf(arg: Any) = {  
  arg match {  
    case Nil => "Nil was passed to arg"  
    case List() => "List() was passed to arg"  
    case _ =>"otherwise"  
  }  
}

但这一个没有:

def wtf(arg: Any) = {  
  arg match {  
    case List() => "List() was passed to arg"  
    case Nil => "Nil was passed to arg"  
    case _ =>"otherwise"  
  }  
}  

线路案例无 => ...被标记为无法访问的代码。为什么在第一种情况下,该行案例列表() => ...是不是标有同样的错误?


实际的答案需要理解一个不幸的实现细节,这花了我很多时间来发现。

1) case List() 调用提取器,在一般情况下不可能进行详尽/不可达性检查,因为提取器调用任意函数。到目前为止一切顺利,我们不能指望能够解决停止问题。

2)早在编译器的“狂野西部”时代,就确定如果“case List()”只是翻译为“case Nil”,则模式匹配可以加快很多(并且不会丢失详尽性检查) “在早期编译阶段,这样就可以避免提取器。情况仍然如此,尽管可以撤消,但显然很多人都被告知“case List() => ”完全没问题,我们不想突然悲观他们的所有代码。所以我必须想出一条路。

通过与其他类一起尝试,您可以根据经验看到 List 具有特权。没有不可达错误。

import scala.collection.immutable.IndexedSeq
val Empty: IndexedSeq[Nothing] = IndexedSeq()
def wtf1(arg: Any) = {  
  arg match {  
    case Empty => "Nil was passed to arg"  
    case IndexedSeq() => "IndexedSeq() was passed to arg"  
    case _ =>"otherwise"  
  }  
}

def wtf2(arg: Any) = {  
  arg match {  
    case IndexedSeq() => "IndexedSeq() was passed to arg"  
    case Empty => "Nil was passed to arg"  
    case _ =>"otherwise"  
  }  
}  
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Nil 和 List 作为 Scala 中的 case 表达式 的相关文章

  • 如何找到两个数据帧之间的精确和非精确匹配?

    我有两个数据框 df1 id amount fee 1 10 00 5 0 2 20 0 3 0 3 90 130 0 4 120 0 35 0 df2 exId exAmount exFee 1 10 00 5 0 2 20 0 3 0
  • 如何为每个用户或系统范围配置 Ivy 缓存目录?

    我在用SBT http www scala sbt org 作为我构建 Scala 项目的构建工具 我的问题是 我无法配置 SBT 将依赖项下载到我的用户主目录 因此 我正在寻找每个用户甚至更好的系统范围设置来告诉 SBT 将 Ivy 缓存
  • 在“GROUP BY”子句中重用选择表达式的结果?

    在 MySQL 中 我可以有这样的查询 select cast from unixtime t time Y m d H 00 as datetime as timeHour from some table t group by timeH
  • Scala 中的模式匹配是如何在字节码级别实现的?

    Scala 中的模式匹配是如何在字节码级别实现的 是不是像一系列if x instanceof Foo 构造 还是其他什么 它对性能有何影响 例如 给出以下代码 来自Scala 示例 http www scala lang org docu
  • Spark - 构建时出现 scala 初始化错误

    我正在尝试在我的 scala 应用程序中使用 Spark 这是我正在使用的 Spark 依赖项
  • 一起调用distinct和map会在spark库中抛出NPE

    我不确定这是否是一个错误 所以如果你这样做 d spark RDD String d distinct map x gt d filter equals x 您将获得 Java NPE 但是如果你做了一个collect之后立马distinc
  • 将括号子集映射到字符

    我正在尝试创建一个 Scala 方法 该方法将采用一个父括号组 表示为字符串 然后将每个括号子组映射到不同的字母 然后它应该将它们放入它返回的映射中 所以基本上我调用以下方法 如下所示 val s 2 x 3 6 val map mapPa
  • 最大模式长度 fpgrowth apache Spark

    我正在尝试使用 Spark Scala 运行关联规则 我首先创建一个 FPGrowth 树并将其传递给关联规则方法 但是 我希望添加最大模式长度参数 以限制我想要在左侧和右侧的项目数量 我只想要项目之间的一对一关联 val model ne
  • 如何在“THEN”中打印“IF”条件的源代码

    我想在 THEN 部分打印 IF 条件的 Scala 源代码 例子 IF 2 2 lt 5 THEN println I am in THEN because sourceCodeOfCondition 现在我们跳过THEN部分 问题是 如
  • 如何对 RDD 进行分区

    我有一个文本文件 其中包含大量由空格分隔的随机浮动值 我正在将此文件加载到 scala 中的 RDD 中 这个RDD是如何分区的 另外 是否有任何方法可以生成自定义分区 以便所有分区都具有相同数量的元素以及每个分区的索引 val dRDD
  • 如何在spark中将矩阵转换为RDD[Vector]

    如何转换自org apache spark mllib linalg Matrix to RDD org apache spark mllib linalg Vector 在火花 该矩阵是由 SVD 生成的 我正在使用 SVD 的结果进行聚
  • 将结构数组分解为 Spark 中的列

    我想将结构数组分解为列 由结构字段定义 例如 root arr array nullable true element struct containsNull true id long nullable false name string
  • 根据类的类型参数在方法中使用 Poly1 映射到 HList

    我有类 参数化为HList和其他一些类型 我该如何使用map on HList在其方法之一中 编译此代码会抛出java lang AssertionError class Test L lt HList P l L p P type Con
  • 通过 Gradle 进行测试时记录日志

    在测试时 Gradle 似乎将 stdout stderr 重定向到project dir build reports tests index html 有没有办法避免这种重定向 并将内容打印到控制台 附加信息 这是一个 Scala 2 9
  • 在 Scala 中生成数字的质因数

    如何在 Scala 中生成整数的因子 这是我的看法1 def factorize x Int List Int def foo x Int a Int List Int if a gt Math pow x 0 5 return List
  • 我在 Scala 中将资源放在哪里?

    在学习使用 Scala 和 JavaFX 时 我在 a 中遇到了以下代码ProScalaFX 示例 https github com jpsacha ProScalaFX val resource getClass getResource
  • 副作用是纯函数中找不到的一切吗?

    可以肯定地说 以下二分法成立 每个给定的函数是 要么纯粹 或有副作用 如果是这样 函数的 副作用就是纯函数中找不到的任何东西 这很大程度上取决于您选择的定义 可以公平地说 函数是pure or impure 纯函数始终返回相同的结果并且不会
  • 将 Scala 文件转换为 Dll

    我有一些使用 IntelliJ 和 SBT Plugin 编写的 scala 代码 并希望将代码作为 C 的 DLL 提供给我 我已经尝试使用 ikvmc 我通过 package 将所有类打包在一个罐子中 之后 我手动设置一个 jar 其中
  • 将无形状 HList 转换为 TupleN,其中元组形状不需要与 HList 形状完全匹配

    我想创建相当于 def toTupleN A1 AN L lt HList l L TupleN A1 AN 代码使用toTupleN仅当恰好有一个时才应该编译N中的值的组合l可以从中创建元组 其他任何内容都应该生成编译时错误 应考虑可用的
  • 将列表拆分为多个具有固定元素数量的列表

    如何将元素列表拆分为最多包含 N 个项目的列表 例如 给定一个包含 7 个元素的列表 创建 4 个组 最后一组可能包含较少的元素 split List 1 2 3 4 5 6 seven 4 gt List List 1 2 3 4 Lis

随机推荐

  • Visual Studio 键绑定配置文件

    Visual Studio 是否有用于其键绑定的人类可编辑的配置文件 选项 gt 环境 gt 键盘 对话框已完全损坏 或者至少使用起来太繁琐 并且自 Visual C 5 以来一直如此 我真的只想转到 Visual Studio 保存键绑定
  • MySQL 8 的 Hibernate 方言?

    MySQL 8 有 Hibernate 方言吗 或者我应该使用 Hibernate 附带的 org hibernate dialect MySQL57Dialect 吗 我正在使用休眠5 2 16 MySQL8Dialect org hib
  • 在 IIS URL Rewrite 2.0 中,为什么 HTTP_HOST 包含端口号?

    我正在尝试使用IIS URL 重写 2 0 http www iis net downloads microsoft url rewrite在 Windows 8 1 上使用 IIS 8 5 根据从重写规则访问 URL 部分 http ww
  • 为什么在使用 wprintf 时将 ©(版权符号)替换为 (C)?

    当我尝试打印版权符号时 with printf or write 它工作得很好 include
  • 无法让简单的引导模式工作

    我正在尝试让一个简单的引导程序模态示例正常工作 我遵循这个文件 http igotstamp appspot com pages javascript上面写着 您可以轻松激活页面上的模态 而无需编写一行 JavaScript 只需为元素提供
  • Visual Studio 展开/折叠键盘快捷键[重复]

    这个问题在这里已经有答案了 In Visual Studio if I have a code file open I can press CTRL M or CTRL M O to collapse all code blocks reg
  • 为什么这个类有两个构造函数?

    我在旨在说明构造函数的幻灯片中看到了这一点 我现在很困惑 因为它有两个具有相同工作的构造函数 接受在第二个构造函数中将 gpa 设置为零 为什么编码器需要重复this id id this name name 再次 为什么这个类需要两个构造
  • 来自 Python 的 AWS 网络负载均衡器后面的客户端 IP

    当在网络负载均衡器后面运行套接字服务器时 实例由 IP 指定 server sock socket socket family socket AF INET type socket SOCK STREAM proto socket IPPR
  • InvalidArgumentError:索引[0,0] = -1 不在 [0, 10) 中

    它与 MLP 一起进行二元分类效果很好 然而 在 LSTM 和卷积中 它给出了InvalidArgumentError 我发现 y 需要重塑 我就这么做了 我尝试了 x 的所有正值 并且模型运行良好 那么负值有什么问题呢 数据在代码中给出
  • Android 应用程序使用 android.permission.READ_LOGS - 这是不礼貌的吗?

    我有一个可以从 Android Market 获取的应用程序 一些用户要求在事情没有按预期进行时进行调试 我一直在考虑添加一个菜单项来显示输出 Process mLogcatProc null BufferedReader reader n
  • Dagger2:用组件本身注入模块提供的实现类

    考虑到模块都是通过 Dagger1 规范相互共享的complete false library true 您可以收到由 Provides通过构造函数参数的方法 就像这样 public class GetUserForUsernameTask
  • 如何计算列表中项目的出现次数

    我是 Dart 新手 目前我有一个重复项目列表 我想计算它们的出现次数并将其存储在地图中 var elements a b c d e a b c f g h h h e a 我想要得到这样的结果 a 3 b 2 c 2 d 2 e 2 f
  • 格式 - 帮助打印表格

    这个问题可能会以捂脸结束 但我已经尝试了一段时间 尽管阅读了超规范 但仍然卡住了 基本上我想做的是 format t 5d 1 23 2 312 23 456 1 7890 但不应该对 5 进行硬编码 而是应该从列表中计算 任何嵌套列表中最
  • 从 ANDROID 2.2 发送 UDP 包(HTC 希望)

    我有一个局域网 我想从我的 android htcdesire 发送一条 udp 消息到我的电脑 它们之间有一个 WLAN 路由器 问题是 UPD 消息永远不会到达 PC Android上的代码 package org example an
  • JSON 架构允许日期或空字符串

    我需要定义一个 JSON 模式 其中输入可以是日期或空字符串 我当前的 JSON 架构是 type object required FirstName DateOfBirth properties FirstName type string
  • R - 自动调整 Excel 列宽

    如何使用自动调整列宽openxlsx 我的其中一列有一个日期变量 例如21 08 2017 并且如果使用复制ctrl c从 Excel 中 并正常粘贴到其他地方 它显示为 如果增加列宽以显示 Excel 中的内容 则可以正常粘贴 我想将重复
  • 在 d3 中设置 id 问题

    这就是我正在做的 selection canvas selectAll circle data mydata selection enter append circle selection attr id function d i var
  • Scala - Slick - 获取包装选项的 TypedType[T]

    通常创建这样的自定义 ID case class CustomID value Int extends MappedTo Int 并用 Option CustomID 等类型表示可为 null 的自定义 ID 但是 我希望能够将 Optio
  • 为什么 >= 有效但 => 无效?

    当检查一个整数是否等于或大于当前数字时 所以我输入 if 5 gt 6 Bla 但它显示这是一个错误 为什么 这不是完全一样吗 if 5 gt 6 Bla 它不起作用的原因是因为 gt 不等于 gt gt 用于拉姆达表达式 http msd
  • Nil 和 List 作为 Scala 中的 case 表达式

    此代码编译 def wtf arg Any arg match case Nil gt Nil was passed to arg case List gt List was passed to arg case gt otherwise