我在几个框架中发现了以下函数调用,在我看来,这些函数调用似乎扩展了一些基类。一些例子:
within(500 millis)
或
"Testcase description" in
{ .... }
第一个示例从 akka 返回持续时间为 500 毫秒的持续时间对象,第二个示例是从 scalatest 返回测试用例的定义。
我想知道这种行为是如何实现的以及如何调用它。
这是通过"Pimp my library"技术完成的。
若要将不存在的方法添加到类中,请定义一个隐式方法,该方法将该类的对象转换为具有该方法的类的对象:
class Units(i: Int) {
def millis = i
}
implicit def toUnits(i: Int) = new Units(i)
class Specs(s: String) {
def in(thunk: => Unit) = thunk
}
implicit def toSpecs(s: String) = new Specs(s)
另请参阅"Scala 在哪里寻找隐式?
如果我
没记错的话,这些代码片段可以脱糖为
within(500.millis)
和
"Testcase description".in({ ... })
这应该可以更容易地看到发生了什么。