我想在我的对象中实现init方法的功能。例如,我的对象结构如下:
object MyObject {
var set: Set[String] = _
var map : Map[String, String] =_
var list: List[Integer] =_
init()
def init() {
// read external file and initialze variables
set = ..
map = ..
list = ..
}
}
我已经定义了一个init方法,并从对象本身调用了init方法。 这是一种正确的方法,还是可以通过更好的方式实现相同的功能?
答案 0 :(得分:3)
你绝对不希望像var
那样拥有这些东西,但好消息是你没有必要。这样的事情怎么样:
object MyObject {
private[this] val data: List[String] = {
// pretend we are reading this from a file
List("1","2","3")
}
val set: Set[String] = data.toSet
val map: Map[String, String] = data.map(x => (x,x)).toMap
val list: List[Int] = data.map(_.toInt)
}
如果你喜欢init()
功能,你可以做这样的事情(虽然它有点笨拙):
object MyObject {
private[this] def init() = {
val data: List[String] = {
// pretend we are reading this from a file
List("1","2","3")
}
val set = data.toSet
val map = data.map(x => (x,x)).toMap
val list = data.map(_.toInt)
(set, map, list)
}
val (
set: Set[String],
map: Map[String, String],
list: List[Int])
= init()
}
答案 1 :(得分:2)
在Scala中body
对象is
init
- 方法。
所以这完全等同于您上面描述的版本。
object MyObject {
private[this] val data: List[String] = {List("1","2","3")}
var mySet: Set[String] = data.toSet
var myMap: Map[String, String] = data.map(x => (x,x)).toMap
var list: List[Int] = data.map(_.toInt)
}
请不要重新定义map
这会导致很多痛苦。
conf.xml
<config>
<size>42</size>
</config>
Example.scala
object Example {
var size : Int = (XML.loadFile("conf.xml") \\ "size").text.toInt
println("I am initialized on object creation: >" + size + "<")
}
scala> :load Example.scala
Loading Example.scala...
import scala.xml.XML
defined object Example
scala> Example
I am initialized on object creation: >42<
res0: Example.type = Example$@3c73951