0

私は MyObject と MyTrait を持っています:

class MyObject(private val myname: String = "") extends MyTrait {

  _name = myname

  def foo(myname : String) {
   _name = myname
  }
}

trait MyTrait {

  protected var _name: String = _

  def name = _name

}

これはこのようにうまく動作します

val myObject = new MyObject("abc")
println(myObject.name)
myObject.foo("def")
println(myObject.name)

版画

abc
def

予想通り。

問題は、MyTrait._name を var ではなく val にしたいことです。しかし、これをコンパイルする方法はありません。ヒントをいただければ幸いです。

よろしく、 オリバー

4

1 に答える 1

7

これは、Rex Kerr と Martin Odersky による最新の命名規則を使用した回答です。

scala-debate listで読んでください。そして、あなたは彼らが「より高い種類」に取り組んでいて、ボックス化されていない int を使って計算していると思っていました。

スタイルの変更に関するPRがありますが、この慣習は少し待つ必要があります。

ドク・マーティンは次のように述べています。That does look promising. I have to experiment with it a little.

したがって、これには注意してください。それは実験的なもので、おそらく化学的に不安定です。

class MyObject(override protected val initialName: String = "") extends MyTrait {

  private var myName: String = initialName

  def name_=(newName: String) {
    myName = newName
  }
  override def name = myName
}

trait MyTrait {
  protected val initialName: String = "default"
  def name = initialName
}
object Test extends App {
  val myObject = new MyObject("abc")
  println(myObject.name)
  myObject.name = "def"
  println(myObject.name)
}

スタイル ガイドには簡潔さに関するセクションがありますが、それ自体は簡潔ではありません。Daniel Sobral による「トレイトでは val よりも def を優先する」という SO に関する回答があると確信しています。また、初期化順序の問題が発生した場合は、1 つの質問からなる FAQを参照することを忘れないでください。

于 2013-07-10T17:22:09.750 に答える