通过某种方法在Scala对象中初始化变量(类似于类中的init方法)

时间:2016-02-19 07:26:18

标签: scala scala-collections

我想在我的对象中实现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方法。 这是一种正确的方法,还是可以通过更好的方式实现相同的功能?

2 个答案:

答案 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 file conf.xml

<config>
  <size>42</size>
</config>

scala对象Example.scala

object Example {
  var size : Int =  (XML.loadFile("conf.xml") \\ "size").text.toInt

  println("I am initialized on object creation: >" + size + "<")
}

在REPL中的用法

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