2016-08-15 10 views
1
class Person { 
    private var privateAge = 0 
    def age() = {privateAge} 
    def age_=(age:Int) {privateAge=age} 
} 

object Main{ 
    def main(args:Array[String]){ 
    val p = new Person 
    p.age = 12 
    } 
} 

コンパイル、p.age = 12昇給の問題:valをに再割り当てスカラ:ブラケット付きメソッドのdiffenenceなく

私はPersonクラスにdef age() = {privateAge}のブラケットを取り外した場合、それが正常に動作している間。

私はp.age = 12メソッドがdef age_=(age:Int) {privateAge=age}に対応するはずですが、なぜ私はdef age() = {privateAge}を変更したのか混乱しました。

+0

可能な重複http://stackoverflow.com/質問/ 4437373/def-val-and-var-in-scala) –

答えて

2

セッター専用のプロパティーを定義することはできません。 Scala only recognizes a setter when it is paired with a corresponding getter。ゲッターはパラメーターリストのないメソッドであり、セッターは名前が_=で終わるメソッドで、ゲッターメソッドの戻り値の型を引数とする単一のパラメーターリストを持ち、Unitを返します。

コードにはゲッターメソッドがありません。ageはパラメータリストを持っているためゲッターではありません。注:空のパラメータリストは、パラメータリストと同じではありません。空の家は家と同じではないのと同じように。

0

これは仕様で定義されているどのようにカスタム割り当てです:

xは、いくつかのテンプレートで定義されたパラメータのない関数であり、同じテンプレートがメンバーとしてsetter関数x_=が含まれ、その後、割り当てx = eが解釈された場合そのセッター機能のx_=(e)を呼び出します。同様に、パラメータなし関数xへの割り当てf.x = eは、呼び出しf.x_=(e)と解釈されます。

http://scala-lang.org/files/archive/spec/2.11/06-expressions.html#assignmentsから)

"パラメータなし" の方法は、ここで定義されています。http://www.scala-lang.org/files/archive/spec/2.11/03-types.html#method-types

([ScalaではDEF、ヴァル、およびVARの使用]の
+0

いいえ、「パラメータなし」については、http://www.scala-lang.org/files/archive/spec/2.11/03- types.html#method-typesと他の答え。 –

+1

素晴らしい、更新します – handler

+0

かっこがage()で使用されている場合、「valに再割当て」エラーが表示される理由を説明できますか?それはage()がprivateAgeの値を返し、int値を別のint値に再割り当てできないためですか? – Samar

関連する問題