2016-06-13 47 views
0

我得到recursive value foo needs type以下代碼:「遞歸價值需求型」與案例類不應用

object Repro { 
    private final case class Foo(bar: Boolean = false) 

    def repro = { 
     val foo = Foo(bar = true) 
     val Foo(bar) = foo 
    } 
} 

然而,重命名未覈銷場編譯就好了。

object Repro { 
    private final case class Foo(bar: Boolean = false) 

    def repro = { 
     val foo = Foo(bar = true) 
     val Foo(bar1) = foo  // <- Here 
    } 
} 

我不知道是什麼導致了這一點 - 在不應用使用bar不可能引用Foo的字段的名稱...

+2

當我編譯你的程序時,有一個警告'警告:未能確定'bar = ...'是一個命名參數還是一個賦值表達式。 上述錯誤消息中提到的定義需要顯式類型。當你定義你的'Foo' case類時,你已經給'bar'一個默認值,所以如果你用'val foo = Foo(true)'來改變'val foo = Foo(bar = true)',那裏在編譯時沒有錯誤。哦,也許這是一個功能(請參閱https://github.com/sbt/sbt/issues/1928)。 – alifirat

+0

謝謝,這很有幫助。但是,爲什麼會導致OP中提到的問題呢? –

回答

2

我不知道是什麼導致了這一點 - 用棒在不應用不可能引用富域的名稱...

它周圍的其他方法:編譯器認爲Foo(bar = true)是指在下一行定義的bar(因爲在Scala中,the scope of a name introduced by a declaration or definition is the whole statement sequence containing the binding)。這就是爲什麼它說「遞歸值foo」:foo使用barbar使用foo

如果您指定foobar的類型,它將不會進行類型檢查,如果確實會得到前向引用錯誤,但編譯器會在到達之前停止。

0

哼哼,我沒有足夠的聲譽添加評論。我發佈我的想法在這裏:

酒吧在第一行是它的表達式的私人蔘數。所以你把它改爲bar1,錯誤固定。

我對於什麼是二線val Foo(bar)=foo

如果我不出手的地步,我會刪除我的答案的建議不是很清楚。

+0

您可能想了解一些關於不適用以及如何使用它 - 這真的很棒。另外,不需要刪除你的答案。 :) –

+0

哼,各種尷尬。感謝您的加薪,在scala中仍然更新。繼續學習〜 – jenkin