Scala奇怪的方法调用语法

时间:2015-01-25 04:35:13

标签: scala implicit specs2

我正在查看Specs2快速入门指南,并很快发现了一些我不熟悉的语法:

"The 'Hello world' string" should {
 // more stuff here
}

深入了解specs2源代码,我发现should是类Described(s: String)的一种方法。此外,Described似乎在类定义之前隐式地以某种方式实例化(作为方法described?):

implicit def described(s: String): Described = new Described(s)
class Described(s: String) {
  def should(fs: =>Fragment) = addFragments(s, fs, "should")
}

我不明白:

  1. 这个隐式实例化的内容是什么
  2. 世界上有哪种语法:"some string" should { ... }。例如。一个字符串,后跟一个方法调用(天真地,如果should是String类的方法,这对我来说才有意义。
  3. 我实际上只是遇到了这种模式似乎回答了我的问题:Pimp my Library模式利用了我不熟悉的隐式转换模式。保持开放以防万一它缺少任何重要的见解,并且因为这篇文章大约是10年前由奥德斯基撰写的。

1 个答案:

答案 0 :(得分:2)

您似乎已回答了自己的问题,但我会发布更多详情。

"皮条客我的图书馆"名称已替换为"丰富的图书馆" (由于可能不需要解释的原因,虽然当我第一次学会拉开图书馆时,我承认我笑了......)

Scala中的Implicits做了3件事:

  • 允许从一种类型到另一种类型的隐式转换
  • (凭借上述内容)允许您以非全局方式安全地扩展现有类。
  • 允许按类型而不是按名称传递值。

隐式扩展方法模式在Scala 2.10中更加正式化;您在问题中描述的上述示例可以更简洁地写为隐式值类:

implicit class Described(s: String) {
  def should(fs: =>Fragment) = addFragments(s, fs, "should")
}

我理解编译器会为隐式值类发出更有效的代码,因为它可以跳过包含扩展方法的包装类的分配。见http://www.blog.project13.pl/index.php/coding/1769/scala-2-10-and-why-you-will-love-implicit-value-classes/