如何初始化一个val的trait变量

Oll*_*liP 0 scala accessor traits

我有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

}
Run Code Online (Sandbox Code Playgroud)

这样可以正常工作

val myObject = new MyObject("abc")
println(myObject.name)
myObject.foo("def")
println(myObject.name)
Run Code Online (Sandbox Code Playgroud)

版画

abc
def
Run Code Online (Sandbox Code Playgroud)

正如所料.

现在的问题是我希望MyTrait._name是val而不是var.但我无法设法将其编译.任何提示赞赏.

此致,奥利弗

som*_*ytt 7

以下是使用Rex Kerr和Martin Odersky最新的尖端命名惯例的答案!

在scala辩论列表上阅读它.而且你认为他们坐在那里工作"更高级别"和计算与未装箱的整数.

样式更改有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)
}
Run Code Online (Sandbox Code Playgroud)

风格指南有一个简洁的部分,但本身并不简短.我确信有关于Daniel Sobral的"更喜欢在特质上贬低val"的答案.当遇到init-order问题时,不要忘记查阅单问题FAQ.