为什么和如何在调用一个arg函数时特别处理元组?
scala coalesces multiple function call parameters into a Tuple — can this be disabled?讨论了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 ^ 所以还有其他事情正在发生.为什么元组在这里特别? 解决方法
与
this explanation相反,Scala解析println(1,2)(或Console println(1,2))与解析任何双参数方法调用相同.之后,编译器通过将方法参数包装在元组中来匹配实际的方法类型签名来转换该调用.
如果编译器没有这样做,则完全有效的表达式,如Console println(1,2)将无法编译,因为println不会占用多个参数.此行为也有other valid use cases. 从编译器的角度考虑像foo bar(1,2)一样的表达式,请记住,Scala具有特殊的语法,允许您删除.和方法调用的括号.这可以是调用带参数1和2的双参数bar方法,或者它可以是使用单元组值参数来调用单参数bar方法.解析器不知道关于bar方法的任何内容,所以它只是作为一个双参数方法调用来解析. 在类型检查阶段,假设编译器确定foo没有双参数bar方法,但它确实有一个单参数bar方法,其签名与元组解释兼容.既然没有其他有效的解释,它假设这是你的意思,并将两个参数转换成一个元组.请注意,如果存在双参数bar方法,即使是与实际参数不兼容的方法,则typer将不执行自动组合转换. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |