使用XScalaWT,这是在Scala 2.7下编译的:
class NodeView(parent: Composite) extends Composite(parent) {
var nodeName: Label = null
this.contains(
label(
nodeName = _
)
)
}
使用2.8.0 RC1,我收到此错误:
类型不匹配;发现:main.scala.NodeView需要:org.eclipse.swt.widgets.Label
类型是:
label(setups: (Label => Unit)*)(parent: Composite) : Label
contains(setups: (W => Unit)*) : W
所以看起来_现在绑定到外部函数而不是内部函数。
这种改变是故意的吗?
更新:这是一个最小化的示例:
Scala 2.7.7:
scala> var i = 0
i: Int = 0
scala> def conv(f: Int => Unit) = if (_:Boolean) f(1) else f(0)
conv: ((Int) => Unit)(Boolean) => Unit
scala> def foo(g: Boolean => Unit) { g(true) }
foo: ((Boolean) => Unit)Unit
scala> foo(conv(i = _))
scala> i
res4: Int = 1
Scala 2.8.0RC3:
scala> var i = 0
i: Int = 0
scala> def conv(f: Int => Unit) = if (_:Boolean) f(1) else f(0)
conv: (f: (Int) => Unit)(Boolean) => Unit
scala> def foo(g: Boolean => Unit) { g(true) }
foo: (g: (Boolean) => Unit)Unit
scala> foo(conv(i = _))
<console>:9: error: type mismatch;
found : Boolean
required: Int
foo(conv(i = _))
^
scala> foo(conv(j => i = j))
scala> i
res3: Int = 1
有趣的是,这有效:
scala> foo(conv(println _))
1
答案 0 :(得分:2)
以下是我在scala用户列表中从Lukas Rytz得到的答案:
嗨Alexey,
语义发生了变化 当我们介绍命名参数时。一个 表达
foo(a = _)
用于解析如下:
foo(x => a = x)
在2.8中,“a”被视为命名 论证,即表达式 解析为:
x => foo(a = x)
我将为其添加迁移警告 这种变化。
答案 1 :(得分:0)
我注意到同样的事情并在Dave的博客上问道:
虽然没有答案。正如你所说,似乎_与外封闭而不是内封闭结合。
更改
nodeName = _
到
x => nodeName = x
解决了这个问题。