Знак равенства и несоответствие типов - PullRequest
4 голосов
/ 17 мая 2011

При работе со стандартным набором инструментов виджетов ( SWT ) я обычно использую что-то подобное для определения моего GridLayout:

layout.marginTop = layout.marginBottom = 
    layout.marginLeft = layout.marginRight =
        layout.horizontalSpacing = layout.verticalSpacing = 20

Это работает в Java, но не в Scala. Это дает мне type mismatch; Found: Unit Required: Int.

Так как же это решить?

Ответы [ 3 ]

7 голосов
/ 17 мая 2011

Вы не можете сделать это в одной строке в Scala, потому что тип результата выражения присваивания (например, a = b) равен Unit.У вас должно быть 6 отдельных вызовов:

layout.marginTop = 20
layout.marginBottom = 20 
... etc

Почему тип результата присвоения Unit и не соответствует назначенному значению?Я полагаю, что это было выбрано по соображениям производительности , как указано в этом вопросе .

Существует вопрос, связанный с при назначении , который указывает, что на сайте объявления , это возможно через:

val a, b, c = X
1 голос
/ 17 мая 2011

Вы могли бы сделать

def assign[A](a:A)(fs: (A => Unit)*) = fs.foreach(_(a))

val r = new java.awt.Rectangle
assign(20)(r.x=_, r.y=_, r.width=_, r.height=_)

Но это явно хуже, чем писать все по отдельности.Но, по крайней мере, вам не нужно каждый раз вводить «layout» в Scala:

val rectangle = new java.awt.Rectangle
import rectangle._
x = 20
y = 20
width = 20
height = 20
1 голос
/ 17 мая 2011

Вы должны написать несколько заданий отдельно.Как говорит компилятор, присваивание в Scala возвращает Unit, что можно рассматривать как Java void.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...