在 GitHub 上编辑此页面

参数解包 - 更多细节

类型检查

类型检查分为两个步骤

  1. 检查参数解元组是否可行
  2. 调整函数并进行类型检查

可行性检查

假设一个函数 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) => RTupleN[T1, ..., Tn] => R的隐式转换,其中n为某个值。现在,这种转换仅对函数值的通用转换有用,当参数解元组化不适用时。需要谨慎地实现转换,以确保其效率。可以使用Scalafix检测和修复过时的转换。

参考

有关更多信息,请参阅Issue #897