2016-11-19 14 views
4

我發現我偶爾想要在特質或其他地方寫一個任意的斷言,但是我想斷言的東西還沒有完全定義。特質中的惰性斷言

trait Foo { 
    val aList: List[String] 
    val anotherList: List[String] 

    def printPairs = aList.zip(anotherList).foreach(println) 

    assert(aList.size == anotherList.size) // NullPointerException, because these references are undefined right now. 
} 

我想的是什麼我要找的是(總是)後級大火被完全定義和實例化一個鉤的推廣,因爲這是哪門子的檢查,我一般會把在構造函數。

回答

1

可以使用早期的定義(搜索它在Scala Language Reference獲取更多信息)做到這一點 - 與你的特質完全按照你寫的,你可以按照如下進行擴展:

class Bar(l1: List[String], l2: List[String]) extends { 
    val aList = l1 
    val anotherList = l2 
} with Foo 

這將啓動 - 這不正是你問(「鉤子」是施工後總是調用),因爲任何擴展的類必須知道哪些成員必須重寫

new Bar(List("a", "b"), List("c", "d")) // built successfully 
new Bar(List("a", "b"), List("c", "d", "e")) // throws exception 

當然:調用assert,因此前清單「早」,但據我所知,這是你能得到的最接近的。

+0

我認爲七分鐘直到回答是我的記錄。你說得對,這不是我想到的,但它非常接近。擴展類必須執行Early Definition子句,否則斷言將失敗,並且子句必須通過斷言,否則斷言將失敗。無論哪種方式,只有斷言存活的類才能被實例化。 – randomstatistic

+0

對於如何在Scala中實現這個問題,你可以經常看到2分鐘的答案,有相當多的聲望獵手,你可以讓你鬆懈;)很高興它有幫助! –

+3

'class Bar(val aList:List [String],val anotherList:List [String])擴展Foo'(一個稍微乾淨的版本) – jwvh