2012-08-23 142 views
1

我在斯卡拉下面的代碼播放框架:奇怪Scala編譯器警告

case class Step(name: String, f: Unit) { 
    def run = {() => f} 
    } 

編譯器給了我一個奇怪的警告有關

comparing values of type Unit and Unit using '==' will always yield true 

回答

5

這是因爲case類定義你的==方法,它比較案例分類中的每個字段。所以Step("a", println("1")) == Step("a", println("2"))是真的,即使認爲Unit函數是不一樣的。

+0

好,理解case類創建應用,並自動取消應用方法,現在我還記得。但是我應該怎麼寫呢?或者我應該放棄案例類並切換到帶有類參數的簡單類? –

+0

伴侶對象與應用方法?它聽起來如何? –

+0

是的,它就像一個魅力,會接受你的答案! –

2

這是非常不可能的,你真的需要f: Unit。畢竟,Unit只有一個值:()

我想你可能會想這樣做的:

Step("Debugging", println("here")) 

其中,的確,尊重所有的類型,但會打印「這裏」呼叫run時,或將run的返回值。相反,當初始化Step時,它將打印「here」,然後將返回值()傳遞到f。在你撥打run時,它什麼都不會做。

也許你想這個代替:

case class Step(name: String, f: => Unit) { 
    def run = {() => f} 
} 

甚至:

case class Step(name: String, f: => Unit) { 
    def run = f 
}