scala coalesces multiple function call parameters into a Tuple -- can this be disabled?讨论 Scala 创建一个元组以绑定(bind)到一个 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
^
所以其他事情正在发生。为什么元组在这里很特别?
最佳答案
与 this explanation 相反, Scala 解析 println(1,2)
(或 Console println (1,2)
就此而言)它解析任何两个参数的方法调用的方式相同。稍后,编译器通过将方法参数包装在一个元组中来转换调用,以匹配实际的方法类型签名。
如果编译器没有这样做,则完全有效的表达式如 Console println (1,2)
将无法编译,因为 println
不接受多个参数。还有other valid use cases对于这种行为。
考虑像 foo bar (1,2)
这样的表达式从编译器的角度来看,请记住 Scala 具有允许您删除 .
的特殊语法。以及方法调用的括号。这可能是对两个参数 bar
的调用带参数的方法 1
和 2
, 或者它可能是对单参数 bar
的调用具有单个元组值参数的方法。解析器对 bar
一无所知。方法,所以它只是解析为两个参数的方法调用。
在类型检查阶段,假设编译器确定 foo
没有两个参数 bar
方法,但它确实有一个参数 bar
签名与元组解释兼容的方法。由于没有其他有效的解释,它假定这就是您的意思并将两个参数转换为一个元组。请注意,如果有两个参数 bar
方法,即使是与实际参数不兼容的方法,打字机也不会执行自动元组转换。
关于scala - 为什么以及如何在调用单参数函数时特别处理元组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5997553/