重视对象内的行为

时间:2018-08-28 15:38:34

标签: scala

我想对以下代码进行澄清:

object A {
  val value: String = test
}

def test: String = {
  println("potato")
  "potato"
}

A.value // produces "potato" as stdout and assigns the value "potato" to `value`

A.value // further calls do NOT print "potato" to stdout

这是我对这种行为的解释。

这里,一次{em>执行一次函数test() ,并且该函数的 value 被分配给{{1} }。进一步调用value只需调用存储的值,而无需调用该函数。

任何人都可以确认吗?

还有,有什么方法可以强制重新调用该函数?

2 个答案:

答案 0 :(得分:2)

我确认,这就是事实。

您可以执行以下操作:

object A {
  def value: String = test
}

def test: String = {
  println("potato")
  "potato"
}

将属性转换为方法,从而在每次调用时调用方法test。

使用Scala合糖,您仍然可以使用A.value语法。

会令人满意吗?

答案 1 :(得分:2)

还有更多的东西。请考虑以下内容。

object A {
  val value: String = test
  val num = 55
}

def test: String = {
  println("potato")
  "potato"
}

// first reference to A
A.num  // produces "potato" to stdout and assigns the value "potato" to A.value

如果将A.value声明为lazy val,则在test的第一个引用之前不会调用A.value。如果A.valuedef,则在每次引用test时都会调用A.value