2009-10-13 74 views
3

我已經做了在斯卡拉一些編程的,我知道這一點,例如,ScalaTest語法如何工作?

xs map f 

是一回事

xs.map(f) 

,但我不知道如何將這種語法推廣到類似ScalaTest的語法,例如,

it should "throw NoSuchElementException if an empty stack is popped" in { 
    val emptyStack = new Stack[String] 
    evaluating { emptyStack.pop() } should produce [NoSuchElementException] 
} 

我主要是想了解一下,看起來像多字結構,即should produce的事情。它很整潔。

+1

ScalaTest是開源的,不是嗎?所以如果你想知道這是如何完成的,那麼就看看源代碼。 – Jesper 2009-10-13 07:07:11

+2

像全局隱式轉換這樣的事情很難找出語法技巧。但是,如果您對如何閱讀/瀏覽有任何具體見解,請分享。 – Yang 2009-10-13 18:36:29

回答

11

這種類型的語法是運算符表示法的方法調用,但是結轉的不僅僅是三個令牌。正如你已經提到:

xs map f 

表示:

xs.map(f) 

但是你可以更進一步說:

xs map f map g 

這意味着:

xs.map(f).map(g) 

在ScalaTest的匹配,例如,你可以說:

result should not be null 

這被編譯器脫到:

result.should(not).be(null) 

此:

it should "throw an exception" in { ... } 

被脫到:

it.should("throw an exception").in { ... } 

大括號,在到底是真的只是一種在代碼中傳遞代碼的方法將花括號(測試代碼)放入in方法中,作爲無參數函數包裝。所有這些都是一樣的想法。操作符表示法連續使用兩次。

最後一個你問的是不同一點點:

evaluating { ... } should produce [IllegalArgumentException] 

這被轉化爲:

evaluating { ... }是,好了,先進行計算,因爲大括號給它的優先級。所以這是一個方法調用,你正在調用一個名爲「evaluate」的方法,將大括號之間的代碼作爲無參數函數傳入。這返回一個對象,應該調用該對象。所以應該是對調用評估返回的對象的一種方法。實際需要的是調用農產品的結果。這裏的產品實際上是一種方法,它有一個類型參數,如[IllegalArgumentException]。它必須這樣做,所以Scala編譯器可以「窮人」 - 認可「那個類型參數。它將一個隱含的「Manifest」參數傳遞給可以爲IllegalArgumentException提供java.lang.Class實例的產品。因此,當該方法被調用時,它具有包含傳遞給評估的代碼的函數,並且可以找到置於方括號中的異常類型的java.lang.Class。因此,它執行try中包含的代碼塊,捕獲異常,並將其與期望的進行比較。如果沒有引發異常或者錯誤,那麼should方法將引發TestFailedException。否則,should方法只是靜靜地返回。

所以,答案是該行被脫到:

(evaluating { ... }).should(produce[IllegalArgumentException] (compilerSuppliedManifest)) 

而這個故事的寓意是,像這種高層次的代碼可以更容易地看到了程序員的意圖,但往往很難理解如何代碼實際上起作用。在實踐中,大部分時間你所關心的是意圖,但是現在你需要知道事情是如何工作的。在Scala中的這種情況下,你可以將-Xprint:typer作爲命令行arg傳遞給Scala編譯器,它會在所有desugaring發生後打印出你的文件的一個版本。所以你可以在需要的時候看到什麼是什麼。

2

這是相當容易的,因爲它是正常的代碼 - it should相當於it.should因此必須有一個值(或方法)it範圍內。和there is

此變量是ItWord類型它公開了一個稱爲should方法這需要BehaveWord類型的對象的。這些匹配器通過隱式轉換混入ShouldMatcherstrait中。

ScalaTest實際上是非常有據可查的有大量的例子和事情如何工作的描述。

+0

感謝您指向文檔中正確位置的指針。對不起,「它應該」的問題其實很明顯(不知道我是怎麼錯過的),但我仍然對'_ should produce _'感到困惑。 – Yang 2009-10-13 18:37:41