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

时间:2013-07-10 15:01:58

标签: 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

}

这样可以正常使用

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

打印

abc
def

正如所料。

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

问候,奥利弗

1 个答案:

答案 0 :(得分:7)

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

the scala-debate list上阅读。而且你认为他们坐在那里工作“更高级别”并使用未装箱的整数进行计算。

样式更改有PR,但此约定必须等待一段时间。

Doc Martin说: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)
}

The style guide有一节简洁,但本身并不简短。我确信有关于Daniel Sobral的“更喜欢在特质上贬低val”的答案。当遇到init-order问题时,不要忘记咨询the one-question FAQ