似乎在Scala对象中禁止在对象主体中包含未初始化的成员。 我想做类似的事情(如果是在Java中)
class MyClass {
private String str;
private String reassignString(String value) {
str = value;
}
我受限制在将代码从对象更改为类的情况下(因为许多团队都使用此仓库)-处理这种情况的一种好的Scala方法是什么?抱歉,这个问题真的很模糊。
答案 0 :(得分:1)
未初始化的值是个坏主意,因此str
需要初始化为有效值。
有三个明显的选择:
赋予str
默认值
private var str: String = _
选择默认的自己
private var str: String = "undefined"
使用Option
class MyClass {
private var str: Option[String] = None
private def reassignString(value: String): Unit = {
str = Some(value)
}
}
答案 1 :(得分:1)
这是另一个坏主意:
object Lazy {
lazy val v = if (underlying ne null) underlying else ???
var underlying: String = null
}
Try(Lazy.v)
Lazy.underlying = "yes"
Try(Lazy.v)
Lazy.underlying = null
Try(Lazy.v)
要点是,惰性val在初始化时会获得多个镜头,但如果您要的话,只能成功初始化一次。
请注意,默认的初始化语法即将退出。他们要您null
来写null
。
我首选的默认初始化程序:
var underlying: String = underlying
只是为了在晚宴上打破僵局。
答案 2 :(得分:0)
考虑default initialiser下划线raw_html = '<html><head><meta charset="utf-8" />'
raw_html += '<script src="https://cdn.plot.ly/plotly-latest.min.js"></script></head>'
raw_html += '<body>'
raw_html += po.plot(fig, include_plotlyjs=False, output_type='div')
raw_html += '</body></html>'
fig_view = QWebView()
fig_view.setHtml(raw_html)
self.dialog_graphViewer.verticalLayout.addWidget(fig_view)
fig_view.show()
fig_view.raise_()
的语法,我们也可以像这样在单例objects中使用
_
请注意,object MyObject {
private var _str: String = _
def str_=(value: String): Unit = this._str = value
def str: String = this._str
}
MyObject.str = "42"
MyObject.str // outputs res0: String = 42
的默认值为String
。
答案 3 :(得分:0)
null
中的 str
。 Scala只是要求您明确表明这是否是您想要的。