scala - 为什么以及如何在调用单参数函数时特别处理元组?

标签 scala tuples

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 的调用带参数的方法 12 , 或者它可能是对单参数 bar 的调用具有单个元组值参数的方法。解析器对 bar 一无所知。方法,所以它只是解析为两个参数的方法调用。

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

关于scala - 为什么以及如何在调用单参数函数时特别处理元组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5997553/

相关文章:

python - 如何替换元组列表中的某些字符

c# - 有什么理由我们不能在元组周围添加一些语法糖吗?

scala - 通过字符串将 List[String] 拆分为单独的列表

java - 如何用 Java 读取/写入堆外内存?

list - 我如何在 Scala 中得到两个列表的平方和?

python - 从元组列表中获取交集

来自 mysqldb 的 Python 列表格式

haskell - 为什么 Tuple 没有 Monad 实例?

scala - 为什么即使用于 sum 的列是强制列,slick 中的分组方法 sum 也会返回 Option?

scala - 内存泄漏在哪里?