Scala 如何初始化作为val的特征变量

Scala 如何初始化作为val的特征变量,scala,accessor,traits,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 my

我有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.\u name是一个val而不是var。但我无法设法编译它。任何提示,不胜感激


尊敬的奥利弗,这里有一个答案,它使用了雷克斯·克尔和马丁·奥德斯基最新的尖端命名约定

继续读下去。你认为他们坐在那里研究“更高的种类”和使用不固定整数进行计算

样式更改有一定的难度,但此约定将不得不等待一段时间

马丁博士说:
看起来确实很有希望。我得试一下。

所以要小心这些东西;这是实验性的,可能化学性质不稳定

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)
}

有关于简洁的一节,但本身并不简短。我相信关于丹尼尔·索布拉尔的《在特质上更喜欢def而不是val》的答案是有的。当您遇到初始化顺序问题时,请不要忘记咨询。

为了向试图解决此问题的任何人澄清,您希望
\u name
为val,并且希望
name
属性由
foo
进行变异,对吗?请参阅我的答案中的样式指南链接和ML讨论中关于为什么下划线在变量名称中会混淆的内容。@som snytt:foo方法是我在粘贴示例代码之前应该删除的遗留方法。val不可写至少我知道;-)@OliverFlow:如果foo方法是superflous/distubing,您可以立即删除它。谢谢您提供的信息。唯一的问题是我不明白他们为什么不在Scala中讨论propper属性,就像在Groovy/Kotlin/Ruby中一样。相反,通过坚持惯例,事情是“固定”的。人们谈论它(),如果你这样做,就会有BeanProperty注释。样式指南实际上提供了一些指导(在访问器下)。基本上,作为重复的自然现象,统一的访问原则。