【发布时间】:2015-01-25 04:35:12
【问题描述】:
我浏览了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")
}
我不明白:
- 这个隐式实例化是关于什么的
- 这个语法到底是怎么回事:
"some string" should { ... }。例如。一个字符串,后跟一个方法调用(天真地,如果should是 String 类上的一个方法,这对我来说才有意义。
我实际上刚刚遇到了这个似乎回答了我的问题的模式:Pimp my Library 模式利用了我不熟悉的这种隐式转换模式。保持打开状态以防它遗漏任何重要的见解,并且因为这篇文章是 Odersky 大约 10 年前写的。
【问题讨论】:
-
结合你的两个问题:如果在类上找不到方法,那么 scala 编译器会尝试找到该类可用的隐式转换,以更改原始对象(在本例中为
String)到另一个具有该方法的类(在本例中为Described) -
Scala 中没有隐式实例化。顺便说一句,只有隐式转换和隐式参数。