我刚开始使用scala,我发现一些语法令人困惑。例如,来自scalatest main page
class ExampleSpec extends FlatSpec with Matchers {
"A Stack" should "pop values in last-in-first-out order" in {...}
}
当我读到它时,意味着“应该”是一个字符串“A stack”的方法?如果这是对的,那会怎么样?它似乎不适用于scala提示
scala> class ExampleSpec {
| "A Stack" should "pop values"
| }
<console>:9: error: value should is not a member of String
"A Stack" should "pop values"
如果“should”不是上述代码段中字符串“A Stack”的方法,那么我该如何正确阅读该代码段呢?什么是“应该”以及它与字符串有什么关系?有线索吗?
答案 0 :(得分:5)
这通常被称为
它的工作方式是FlatSpec
混合了一个名为ShouldVerb
的特征,其中定义了以下隐式转换:
implicit def convertToStringShouldWrapper(o: String): StringShouldWrapperForVerb =
new StringShouldWrapperForVerb {
val leftSideString = o.trim
}
StringShouldWrapperForVerb
定义了should
方法:
def should(right: String) ....
它在REPL中不起作用的原因是你没有FlatSpec
并且通过混合了ShouldVerb
特征。
您可以在文档under implicit classes中了解更多相关信息。
答案 1 :(得分:2)
在org.scalatest.Matchers
中,提供了隐式转换,可将String
转换为StringShouldWrapper
,这是在should
上提供String
函数的类:< / p>
implicit def convertToStringShouldWrapper(o: String): StringShouldWrapper
当遇到该调用时,编译器将隐式将任何String
转换为StringShouldWrapper
。如果在不存在的对象上调用函数,编译器将检查范围内的隐式转换(如上所述)以查看是否有任何转换将提供该函数。