有人可以解释为什么下面的代码会编译吗?
我认为它不应该编译。
object RandomExperiments extends App{
def takeTuple(t:(Int,Int))=print (s"$t ${t._1}\n")
takeTuple(1,3) // this should not compile !!!
takeTuple (1,3) // this should not compile !!!
takeTuple((1,3))
takeTuple(((1,3)))
def takeTwoInts(i1:Int,i2:Int)=print (s"$i1 $i2\n")
takeTwoInts(1,2)
// takeTwoInts((1,2)) // does not compile , this is expected
}
(1,3) 1
(1,3) 1
(1,3) 1
(1,3) 1
1 2
答案 0 :(得分:8)
它被称为自动翻译。编译器发现takeTuple
没有可用于具有两个Int
参数的重载,但是可以识别出参数是否可以转换为(Int, Int)
并进行转换。如果您使用-Xlint:_
进行编译,则会看到如下警告:
scala> takeTuple(1,3)
<console>:12: warning: Adapting argument list by creating a 2-tuple: this may not be what you want.
signature: takeTuple(t: (Int, Int)): Unit
given arguments: 1, 3
after adaptation: takeTuple((1, 3): (Int, Int))
takeTuple(1,3)
^
您可以使用-Yno-adapted-args
标记(推荐)来禁用此功能