2015-06-10 47 views
1

我剛剛開始使用scala,我發現一些語法混淆。例如,從scalatest main pagescalatest「堆棧」應該「做點什麼」 - wtf?字符串的方法應該如何?

class ExampleSpec extends FlatSpec with Matchers { 

    "A Stack" should "pop values in last-in-first-out order" in {...} 
} 

正如我讀它,這意味着「應該」是字符串「A堆疊」的方法?如果這是正確的,那是怎麼發生的?它似乎並沒有從斯卡拉提示

scala> class ExampleSpec { 
| "A Stack" should "pop values" 
| } 
<console>:9: error: value should is not a member of String 
     "A Stack" should "pop values" 

在上面的代碼片段工作,如果「應該」是不是字符串「A堆棧」的方法,那麼,我該怎樣正確地讀取片段?什麼是「應該」,它與字符串有什麼關係?任何線索?

+0

如果你想要在控制檯上工作,打開sbt然後鍵入'console',然後輸入org.scalatest.Matchers' – Chris

回答

5

這就是通常所知的 Pimp我的庫豐富我的庫模式,我們可以通過隱式轉換使用我們自己的方法擴展其他庫(在這種情況下,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中閱讀更多關於此的信息。

2

org.scalatest.Matchers,提供了一種隱式轉換,其將StringStringShouldWrapper,其是提供上Stringshould函數的類:

implicit def convertToStringShouldWrapper(o: String): StringShouldWrapper 

編譯器將隱含轉換任何StringStringShouldWrapper時它遇到那個呼叫。如果你在一個不存在的對象上調用一個函數,編譯器會檢查範圍內的隱式轉換(比如上面的那個),看看它們中的任何一個是否會提供這個函數。

+0

在這種情況下,我認爲問題是關於測試套件應該如何完成來自'FlatSpec'而不是'Matchers'。 –