2010-04-29 4 views
3

Использование XScalaWT, это компилируется под Scala 2.7:Изменено поведение Scala 2.8: _?

class NodeView(parent: Composite) extends Composite(parent) { 
    var nodeName: Label = null 

    this.contains(
    label(
     nodeName = _ 
    ) 
) 
} 

С 2.8.0 RC1, я получаю эту ошибку:

type mismatch; found : main.scala.NodeView required: org.eclipse.swt.widgets.Label

типы являются:

label(setups: (Label => Unit)*)(parent: Composite) : Label 
contains(setups: (W => Unit)*) : W 

Так это выглядит как _ теперь привязывается к внешней функции вместо внутренней.

Это изменение намеренно?

UPDATE: Вот минимизированы пример:

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

Вы можете разместить больше или сообщение об ошибке? –

+0

Я отправил сообщение об ошибке: «type mismatch; found: main.scala.NodeView required: org.eclipse.swt.widgets.Label« –

+0

В какой строке ссылается компилятор? –

ответ

2

Вот ответ, который я получил от Lukas Rytz в списке пользователей Scala:

Hi Alexey,

there has been a change in semantics when we introduced named arguments. An expression

foo(a = _) 

used to be parsed as follows:

foo(x => a = x) 

In 2.8, "a" is treated as a named argument, i.e. the expression is parsed as:

x => foo(a = x) 

I will add a migration warning for this change.

+1

В некоторых случаях вместо этого вы можете получить старое поведение с фигурными фигурными скобками. – Debilski

0

я заметил то же самое, и спросил на блоге Дейва:

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

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

Изменение

nodeName = _ 

к

x => nodeName = x 

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

+0

Да, но для меня очень мало читается код XScalaWT. –

+0

Да, конечно, и это действительно странно, что семантика _ сильно изменилась. Мне бы очень хотелось понять, что произошло. –

+0

Если вы еще не видели ответа, это не семантика _, которая изменилась, но =. –

Смежные вопросы