2016-03-07 78 views
1

爲什麼我不能在類的主體中定義構造函數arg myval?例如特質是無法看到的構造ARG如下所示:Scala:爲什麼自我類型特徵不能看到構造函數參數

scala> class A(myval: String){} 

scala> trait B { 
    | this: A => 
    | println(myval) 
    | } 
<console>:8: error: not found: type A 
     this: A => 
     ^
<console>:9: error: not found: value myval 
     println(myval) 
     ^

我不得不在類的身體再次聲明構造ARG。

scala> class A(_myval: String){ val myval = _myval} 
defined class A 

scala> trait B { 
    | this: A => 
    | println(myval) 
    | } 
defined trait B 

有人可以幫我理解這是爲什麼嗎?

回答

1

這是因爲class默認情況下沒有定義吸氣劑,因此您無權訪問myval

如果你這樣做:

class A(_myval:String) { 
def myval = _myval 
} 

trait B { 
this : A => println(myval)} 

這個工程。

您的示例將按「原樣」使用case class,因爲自動獲取器會自動生成。

編輯:根據Rob Starling的評論,您可以將類定義縮短爲class A(val myval:String)

+0

謝謝 - 這是我現在所做的。但是我在身體中定義的任何val都可用。 – JasonG

+2

您甚至可以通過將'A'定義爲'class A(val myval:String);' –

+0

@JasonG yes來更簡潔地做到這一點,因爲Scala中的默認可見性是'public'。 @Rob好的提示不知道。 – Esardes

相關問題