scalatest“堆栈”应该“做点什么” - wtf?字符串的方法应该怎么做?

时间:2015-06-10 13:24:44

标签: scala scalatest

我刚开始使用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”的方法,那么我该如何正确阅读该代码段呢?什么是“应该”以及它与字符串有什么关系?有线索吗?

2 个答案:

答案 0 :(得分:5)

这通常被称为 Pimp My Library Enrich My Library模式,我们可以通过隐式转换使用我们自己的方法扩展其他库(在本例中为Scala字符串)。

它的工作方式是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。如果在不存在的对象上调用函数,编译器将检查范围内的隐式转换(如上所述)以查看是否有任何转换将提供该函数。