Scala函数调用

3

我在几个框架中发现了以下函数调用,这些调用看起来像是框架扩展了一些基类。以下是一些例子:

within(500 millis)

或者
"Testcase description" in
  { .... }

第一个示例从akka返回一个持续时间为500毫秒的持续时间对象,第二个示例是scalatest中测试用例的定义。

我想知道如何实现这种行为以及它被称为什么。


1
这种行为是通过隐式转换完成的。在SO上有一些相关问题,可以搜索“pimp-my-library”。 - kiritsuku
你的问题标题可以更加具体明确。 - Michael Lorton
2个回答

10
这是通过 "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 在哪里查找隐式值?"


1

如果我没记错的话,那些代码片段可以被解糖化为

within(500.millis)

并且

"Testcase description".in({ ... })

这应该使得看到正在发生的事情更容易。


是的,我知道,但是Integer类必须有一个名为“millis”的成员,或者String需要有一个它们没有的“in”。 - Sebastian
@Sebastian:我猜可能是发生了某种隐式转换,但我的Scala技术还没有达到那个水平,所以我不确定。 - hammar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接