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

Aar*_*ers 2 scala scalatest

我刚刚开始使用scala,我发现一些语法令人困惑.例如,从最新的主页面

  class ExampleSpec extends FlatSpec with Matchers {

    "A Stack" should "pop values in last-in-first-out order" in {...}
 }
Run Code Online (Sandbox Code Playgroud)

当我读到它意味着"应该"是一个字符串"A堆栈"的方法?如果这是对的,那会怎么样?它似乎不适用于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"
Run Code Online (Sandbox Code Playgroud)

如果"should"不是上述代码段中字符串"A Stack"的方法,那么我该如何正确阅读该代码段呢?什么是"应该"以及它与字符串有什么关系?有线索吗?

Ako*_*chy 5

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

它的工作方式是FlatSpec混合在一个特征中,该特征被ShouldVerb定义为以下隐式转换:

 implicit def convertToStringShouldWrapper(o: String): StringShouldWrapperForVerb =
   new StringShouldWrapperForVerb {
     val leftSideString = o.trim
   }
Run Code Online (Sandbox Code Playgroud)

并定义StringShouldWrapperForVerbshould方法:

def should(right: String) ....
Run Code Online (Sandbox Code Playgroud)

它在REPL中不起作用的原因是你没有FlatSpec和通过ShouldVerb混合的特性.

您可以在隐式类下的文档中阅读有关此内容的更多信息.