“20秒”在 Scala 中是如何工作的?

如何编译:

import scala.concurrent.duration._


val time = 20 seconds

这到底是怎么回事?

47427 次浏览

正在进行的“魔术”被称为“隐式转换”。您正在导入隐式转换,其中一些处理 Int (和 Double)到 Duration 之间的转换。这就是你要面对的。

发生了一些事情。

首先,Scala 允许在许多方法调用中省略点和括号,因此 20 seconds等价于 20.seconds() * 。

其次,应用了“隐式转换”。因为 20Int,而 Int没有 seconds方法,所以编译器搜索一个隐式转换,该转换接受一个 Int并返回一个 确实有方法,搜索范围受到方法调用的约束。

已将 持续时间导入到作用域中。因为 DurationInt是一个带有 Int参数的隐式类,所以它的构造函数定义了一个隐式 Int => DurationInt转换。DurationInt有一个 seconds方法,因此它满足所有的搜索条件。因此,编译器将调用重写为 new DurationInt(20).seconds * * 。

我的意思是 * 。20.seconds()实际上是无效的,因为 seconds方法没有参数列表,因此在方法调用中省略了括号 必须的

实际上,这并不完全正确,因为 DurationInt是一个值类,所以编译器将尽可能避免包装整数。