Scala 2.8:_行为改变了?

时间:2010-04-29 07:24:21

标签: scala scala-2.8

使用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

2 个答案:

答案 0 :(得分:2)

以下是我在scala用户列表中从Lukas Rytz得到的答案:

  

嗨Alexey,

     

语义发生了变化   当我们介绍命名参数时。一个   表达

foo(a = _)
     

用于解析如下:

foo(x => a = x)
     

在2.8中,“a”被视为命名   论证,即表达式   解析为:

x => foo(a = x)
     

我将为其添加迁移警告   这种变化。

答案 1 :(得分:0)

我注意到同样的事情并在Dave的博客上问道:

http://www.coconut-palm-software.com/the_new_visual_editor/doku.php?id=blog:simplifying_swt_with_scala#comment__930ba2f0a020203873d33decce01ebc2

虽然没有答案。正如你所说,似乎_与外封闭而不是内封闭结合。

更改

nodeName = _

x => nodeName = x

解决了这个问题。