2

给定一个带有签名的方法

def declareParam[T](name: String, setter: T => _, getter: => T): Unit

和消费代码

var v = 1
params.declareParam("someName", v_=, v)

一切都会成功编译,但我对 scala 足够新,我不知道它是否会按预期工作。如果我更改 v 并且稍后其他一些代码获取声明的参数并调用存储的 getter,它将返回新值还是返回 1(我调用 declareParam 时的值)?

4

1 回答 1

3

这仅适用于类定义。

在这种情况下var v不是一个变量,而是一个字段。

尝试这个:

{
  var v = 1
  params.declareParam("someName", v_=, v)
}

你会得到一个编译错误。

var字段是使用 getter 和 setter 方法实现的。因此,您在范围内有 2 种方法:def v_=(i: Int): Unitdef v(): Int.

Scala 编译器可以隐式地将方法转换为函数,例如:

(1 to 10).foreach{println}

println是来自Predef对象的方法。编译器创建一个这样的函数:

(1 to 10).foreach{ i => Predef.println(i)}

所以你的代码意味着这个:

params.declareParam("someName", i => this.v_=(i), () => this.v)
于 2013-08-05T17:36:34.513 回答