Scala 在调用单参数函数时为什么以及如何特殊对待元组?

2024-05-01

scala 将多个函数调用参数合并到一个元组中——这可以禁用吗? https://stackoverflow.com/questions/2850902讨论 Scala 创建一个元组来绑定到一个 arg 函数。这导致

scala> println(1, 2)
(1,2)

答案说编译器允许在不带括号的情况下调用一个 arg 函数,因此从逻辑上讲,这是对带有元组的 println 的调用。

但是 println 不能用单个元组参数调用

scala> val t = (1, 2)
t: (Int, Int) = (1,2)

scala> println t
<console>:6: error: value t is not a member of Unit
       println t
           ^

所以还有其他事情正在发生。为什么元组在这里很特别?


与之相反这个解释 https://stackoverflow.com/questions/2850902/scala-coalesces-multiple-function-call-parameters-into-a-tuple-can-this-be-dis/2851212#2851212, Scala parses println(1,2) (or Console println (1,2)就此而言)与解析任何双参数方法调用的方式相同。随后,编译器通过将方法参数包装在元组中来转换调用,以匹配实际的方法类型签名。

如果编译器没有这样做,则完全有效的表达式如Console println (1,2)将无法编译,因为println不接受多个参数。还有其他有效用例 https://stackoverflow.com/questions/5985076/scala-generic-class-supporting-function-of-multiple-arities对于这种行为。

考虑这样的表达式foo bar (1,2)从编译器的角度来看,请记住 Scala 有特殊的语法,允许您删除.以及方法调用的括号。这可能是对两个参数的调用bar带参数的方法1 and 2,或者它可能是对一个参数的调用bar具有单个元组值参数的方法。解析器不知道任何关于bar方法,因此它只是解析为两个参数的方法调用。

在类型检查阶段,假设编译器确定foo没有两个参数bar方法,但它确实有一个参数bar其签名与元组解释兼容的方法。由于没有其他有效的解释,它假设这就是您的意思并将两个参数转换为一个元组。请注意,如果有两个参数bar方法,即使是与实际参数不兼容的方法,即打字机will not执行自动Tuupling变换。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Scala 在调用单参数函数时为什么以及如何特殊对待元组? 的相关文章

随机推荐