我有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。但我无法设法将其编译。任何提示都赞赏。
问候,奥利弗
答案 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。