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(使用前将#替换为@)