1

我想用 Scala 写这个:

var b: Map[String, Int] = Map()
def method() = {
  def a_=(i: Int) = b += "method" -> i
  // ...
  a = 2
}

但这抱怨说 a 没有定义。这是为什么?我以为a = ...被重写为a_=(...).

解决方案:感谢 Jörg,我工作,必须提供 getter 并使方法成为顶级:

var b: Map[String, Int] = Map()
def a_=(i: Int) = b += "method" -> i
def a: Int = ??? // Dummy
def method() = {
  // ...
  a = 2
}

这编译。

4

2 回答 2

3

这是为什么?我以为a = ...被重写为a_=(...).

不。

  1. 您需要一个 getter一个 setter 才能使重写生效。
  2. 重写仅在有要重写的内容时发生,即对objectclass或的字段访问trait

请参阅第 6.15 节Scala 语言规范的分配粗体强调我的):

如果x是在某个模板中定义的无参数函数,并且同一模板包含一个 setter 函数x_=作为成员,则赋值x = e被解释为x_=(e)对该 setter 函数的调用。

于 2016-10-10T13:48:49.643 回答
0

您不能覆盖赋值运算符,因为它是保留字。你可以做的是:

object BAndA {
  var b: Map[String, Int] = Map()

  def a = b // getter
  def a_=(i: Int) = b += "method" -> i // setter
}

object Test extends App {
  import BAndA._

  a = 1
  println(b)
}

需要吸气剂

于 2016-10-10T13:45:46.197 回答