重写本地var赋值

时间:2016-10-10 12:42:02

标签: scala variable-assignment rewriting

我想在Scala中写这个:

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

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

解决方案:感谢Jörg,我工作,必须提供吸气剂并使方法达到顶级水平:

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

编译。

2 个答案:

答案 0 :(得分:3)

  

为什么?我认为a = ...被重写为a_=(...)

没有

  1. 你需要一个getter 一个setter才能使重写生效。
  2. 重写仅在有重写内容时发生,即objectclasstrait的字段访问权。
  3. 请参阅section 6.15 Assignments of the Scala Language Specifiation粗体强调我的):

      

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

答案 1 :(得分: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)
}

getter被要求