重写局部变量赋值



我想用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
}
这个编译

为什么?我以为a = ...被改写成a_=(...)

  1. 你需要一个getter 一个setter来使重写生效。
  2. 重写只发生在有东西需要重写时,即object, classtrait的字段访问。

参见Scala语言规范的6.15节赋值 (粗体强调我的):

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

不能重写赋值操作符,因为它是保留字。你可以这样做:

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)
}

需要getter

最新更新