2010-09-01 75 views
5

當我嘗試從方法調用省略點,就像這個例子程序:斯卡拉中的「遞歸方法<method name>需要類型」是什麼意思?

object Test extends Application { 
    val baz = new Baz 
    var foo = baz bar 
    println(foo) 
} 

class Baz { 
    def bar = "bar" 
} 

我一些奇怪的錯誤。第一個是error: recursive method foo needs type: println foo,另一個是error: type mismatch; found: Unit, required: Int, println(foo)。如果我指定foo的類型應該是String,那麼第一個錯誤是以某種奇怪的方式修復的。第二個在我在bazbar之間加點之前不會消失。這是什麼原因?爲什麼Scala認爲baz bar是遞歸方法?

+0

相似:http://stackoverflow.com/questions/2246212/why-does-scalas-semicolon-inference-fail-here – missingfaktor 2010-09-01 13:19:57

回答

7

您所看到的問題是,如果您忽略了小點,則代碼是模糊的。編譯器將處理該表達式作爲

var foo = baz.bar(println(foo)) 

foo從而遞歸地定義並StringOps.apply方法需要一個Int參數(String將被隱式轉換爲StringOps作爲String沒有apply方法)。

在調用採用一個非Unit參數的方法以避免此類歧義時,應該只使用操作符的語法。

+0

非常感謝你的答案。我不知道斯卡拉會試圖把線條放在一起。我認爲它將分行符作爲分號處理。我嘗試了一下,並且可以通過在'val foo = baz bar'後插入分號來解決問題。 – mranders 2010-09-01 12:34:33

+0

Scala通常將換行符視爲空格,但編譯器試圖在需要時推斷分號。在你的情況下,這不能與類型推斷一起使用。 – Moritz 2010-09-01 12:52:29