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 是 val 而不是 var。但是我无法设法让它编译。任何提示表示赞赏。

问候,奥利弗

4

1 回答 1

7

这是使用来自 Rex Kerr 和 Martin Odersky 的最新尖端命名约定的答案!

在 scala-debate list上阅读它。而且您认为他们坐在那里研究“更高类型”并使用未装箱的整数进行计算。

样式更改有一个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)关于“在特征中更喜欢 def 而不是 val”的答案。当您遇到 init-order 问题时,不要忘记查阅one-question FAQ 。

于 2013-07-10T17:22:09.750 回答