我想用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_=(...)
了
- 你需要一个getter 和一个setter来使重写生效。
- 重写只发生在有东西需要重写时,即
object
,class
或trait
的字段访问。
参见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