137

以下如何编译:

import scala.concurrent.duration._

val time = 20 seconds

这里到底发生了什么?

4

2 回答 2

178

有几件事正在发生。

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

其次,应用“隐式转换”。由于20is anInt并且Int没有seconds方法,因此编译器会搜索一个隐式转换,该转换接受 anInt并返回具有方法的内容seconds,搜索受方法调用范围的限制。

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

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

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

于 2013-02-27T05:22:53.637 回答
7

那里发生的“魔术”称为“隐式转换”。您正在导入隐式转换,其中一些处理 Int(和 Double)到 Duration 之间的转换。这就是你正在处理的事情。

于 2013-02-27T05:07:13.640 回答