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

以下是如何编译的:

import scala.concurrent.duration._ val time = 20 seconds 

这里究竟发生了什么?

有几件事情正在进行。

首先,Scala允许在许多方法调用中忽略点和20.seconds() ,所以20 seconds等价于20.seconds() *。

其次,应用“隐式转换”。 由于20是一个Int并且Int没有seconds方法,所以编译器search一个隐式转换,它接受一个Int并返回一个 seconds方法的东西,这个search被方法调用的范围所约束。

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

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

**实际上,这是不正确的,因为DurationInt是一个值类,所以如果可能的话,编译器将避免包装整数。

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