scala - 什么是 Scala 中的单元类型行为
问题描述
为什么此代码有效:
val f: String => Unit = {(_:String) => 2}
//or more succinctly
val f: String => Unit = _ => 2
显然我的函数体返回一个 int。但是预期的类型是 Unit
但如果我这样做
implicitly[String <:< Unit]
//Cannot prove that String <:< Unit.
因此,我对演员阵容是如何发生的感到有些困惑?为什么一开始就被允许
解决方案
这称为Value Discarding,参见6.26.1 Value Conversions, Scala 语言规范的Value Discarding 小节:
如果有一些值类型,预期的类型是
Unit
,通过将其嵌入到 term 中,将其转换为预期的类型{ ; () }
。
换句话说,您的代码被编译为就像您编写的一样
val f: String => Unit = {(_:String) => { 2; () }}
//or more succinctly
val f: String => Unit = _ => { 2; () }
我猜这个特性背后的意图是让来自命令式编程语言的程序员熟悉,在这种语言中,通常可以丢弃值。
例如,在 C 中,写成是合法的
printf("Hello");
并丢弃返回值,即使printf
返回一个int
. 这与许多命令式编程语言所具有的表达式语句和语句表达式的概念相结合。
推荐阅读
- python - Pandas 数据帧条件插值
- azure-blob-storage - 特定文件的 Azure SAS 令牌
- c++ - C++ 修复队列和额外的逗号
- javascript - 发生ajax请求时DataTables无法更改数据
- python - TypeError:在尝试应用编码器时,“str”和“method”的实例之间不支持“<”
- android - APK 安装因 NativeHelper 失败:复制本机库失败 [errorCode=-113]
- swift - 如何将 DateComponents 格式化为部分日期字符串?
- angular - Angular:Webpack 可以用来动态加载脚本吗?
- db2 - 当我将数字数据从 DB2 导出到 del 文件时,它失去了准确性
- r - 如何在 echarts4r 上将标题居中?