如何编译:
import scala.concurrent.duration._ val time = 20 seconds
这到底是怎么回事?
正在进行的“魔术”被称为“隐式转换”。您正在导入隐式转换,其中一些处理 Int (和 Double)到 Duration 之间的转换。这就是你要面对的。
发生了一些事情。
首先,Scala 允许在许多方法调用中省略点和括号,因此 20 seconds等价于 20.seconds() * 。
20 seconds
20.seconds()
其次,应用了“隐式转换”。因为 20是 Int,而 Int没有 seconds方法,所以编译器搜索一个隐式转换,该转换接受一个 Int并返回一个 确实有方法,搜索范围受到方法调用的约束。
20
Int
seconds
已将 持续时间导入到作用域中。因为 DurationInt是一个带有 Int参数的隐式类,所以它的构造函数定义了一个隐式 Int => DurationInt转换。DurationInt有一个 seconds方法,因此它满足所有的搜索条件。因此,编译器将调用重写为 new DurationInt(20).seconds * * 。
DurationInt
Int => DurationInt
new DurationInt(20).seconds
我的意思是 * 。20.seconds()实际上是无效的,因为 seconds方法没有参数列表,因此在方法调用中省略了括号 必须的。
实际上,这并不完全正确,因为 DurationInt是一个值类,所以编译器将尽可能避免包装整数。