Scala 如何初始化作为val的特征变量
我有MyObject和MyTrait: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
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注释。样式指南实际上提供了一些指导(在访问器下)。基本上,作为重复的自然现象,统一的访问原则。