“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之间的转换。 这就是你正在处理的。