Scala-声明val字段并在方法内部对其进行初始化

时间:2018-10-17 08:24:41

标签: scala

我想声明几个val字段,并在init方法中对其进行初始化,以便我可以在它们所属的类的整个范围内使用这些字段。

例如。

Class A {

  val field1 
  val field2

  def init():Unit{
  ----
  ----
  field1 = ----
  ----
  ----
  field2 = ----
  }
}

我知道这可能不是面向功能的Scala的最佳实践,因为上述情况下的init()方法具有副作用。

我们应该如何在Scala中处理上述要求,以便我们不事先知道字段的值但需要执行一些逻辑来导出该字段的值,而在字段中声明和分配呢?

抱歉,这可能是一个太基本的问题,但是我对Scala并不陌生,因为他来自Java背景,因此我的想法就像我们在Java世界中所做的那样。

2 个答案:

答案 0 :(得分:1)

由于@Tim的输入,我已经编辑了答案:

在下面的示例中,我通过public方法计算了field1, field2, field3成员init,该方法获取一些构造函数args并返回一个元组

scala> :paste
// Entering paste mode (ctrl-D to finish)

class A(a: Int, b: String, c: Boolean, d: List[Double]) {
  lazy val (field1, field2, field3): (String, Double, Boolean) = init(a, b, c, d) // lazy is optional (see comment below)

  private def init(w: Int, x: String, y: Boolean, z: List[Double]): (String, Double, Boolean) = {
    (
      x + w,
      z.sum,
      y & w %2 == 0
    )
  }
}

val a = new A(1, "sss", true, List(1d, 2.1, 3.14))

println(a.field1)
println(a.field2)
println(a.field3)

// Exiting paste mode, now interpreting.

sss1
6.24
false
defined class A
a: A = A@52a7928a

我想这不是函数式编程的最佳形式。但是,没有var这样的突变。如果您的init方法像我的那样,仅评估某些外部参数并为该类的val成员计算一个固定值,那就可以了。

https://alvinalexander.com/scala/scala-class-examples-constructors-case-classes-parameters

https://docs.scala-lang.org/tour/classes.html

答案 1 :(得分:-1)

marstran 所建议的,您可以为此使用lazy val:

lazy val field1:T

def initilizeField1(value:T): T ={
field1:T = value
}

其中T是val字段1的通用类型。

class A {
    lazy val field1: Int = initilizeField1(5)

    def initilizeField1[T](value:T): T ={
      value
    }
  }