参数解包 - 更多细节
类型检查
类型检查分为两个步骤
- 检查参数解元组是否可行
- 调整函数并进行类型检查
可行性检查
假设一个函数 f
的形式为 (p1, ..., pn) => e
(其中 n > 1
),其中 p1, ..., pn
为参数,e
为函数体。
如果用于检查f
的预期类型是形式为TupleN[T1, ..., Tn] => R
(或等效的 SAM 类型)的完全定义的函数类型,其中每个类型Ti
都适合相应的参数pi
。那么f
对于参数解元组化来说是可行的,预期类型为TupleN[T1, ..., Tn] => R
。
如果以下两种情况之一为true
,则类型Ti
适合参数pi
pi
没有类型,即它是一个简单的标识符或_
。pi
的形式为x: Ui
或_: Ui
,并且Ti <: Ui
。
参数解元组化与 eta 扩展组合。也就是说,由 eta 扩展生成的 n 元函数可以依次通过参数解元组化适应预期类型。
项适配
如果函数
(p1, ..., pn) => e
对于参数解元组化来说是可行的,预期类型为TupleN[T1, ..., Tn] => Te
,那么继续使用相同的预期类型检查以下适配后的函数
(x: TupleN[T1, ..., Tn]) =>
def p1: T1 = x._1
...
def pn: Tn = x._n
e
。
迁移
以前无法编写这样的代码,因此采用新符号后不会产生歧义。
可能有人已经编写了从(T1, ..., Tn) => R
到TupleN[T1, ..., Tn] => R
的隐式转换,其中n
为某个值。现在,这种转换仅对函数值的通用转换有用,当参数解元组化不适用时。需要谨慎地实现转换,以确保其效率。可以使用Scalafix
检测和修复过时的转换。
参考
有关更多信息,请参阅Issue #897。
本文档涵盖以下内容