Scala 2.8: _ поведение изменилось? - PullRequest
3 голосов
/ 29 апреля 2010

Используя 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 ]

2 голосов
/ 08 июня 2010

Вот ответ, который я получил от Лукаса Ритца в списке пользователей scala:

Привет, Алексей,

произошла смена семантики когда мы ввели именованные аргументы. выражение

foo(a = _)

раньше анализировали следующим образом:

foo(x => a = x)

В 2.8 «а» рассматривается как именованный аргумент, то есть выражение анализируется как:

x => foo(a = x)

Я добавлю предупреждение о миграции для это изменение.

0 голосов
/ 04 июня 2010

Я заметил то же самое и спросил в блоге Дэйва:

http://www.coconut -palm-software.com / the_new_visual_editor / doku.php ID = блог: simplifying_swt_with_scala # comment__930ba2f0a020203873d33decce01ebc2

Пока ответа нет. Как вы говорите, похоже, что _ привязывается к внешнему закрытию, а не к внутреннему.

Изменение

nodeName = _

до

x => nodeName = x

исправляет проблему.

...