2011-05-17 48 views
4

当与标准部件工具箱(SWT)的工作,我通常使用这样的定义我GridLayout等号和类型不匹配

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

它可以在Java,但不是在斯卡拉。 它给我type mismatch; Found: Unit Required: Int

那么这怎么解决呢?

回答

7

不能在阶为此在一个行中,因为赋值表达式的结果类型(例如a = b)是Unit。你必须有6个独立的呼叫:

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

为什么是结果型的分配Unit和NMOT指定的值吗?我相信这是因为性能原因as outlined in this question而选择的。

有一个related question on assignment它指出,在声明网站,可以通过:

val a, b, c = X 
+0

......我想Scala是关于语法糖和“种类比较少,做多”的理念:/ – phineas 2011-05-17 13:17:14

+0

@phineas如果你想在SWT中输入更少的内容来做更多的事情,一定要查看Dave Orme的[XScalaWT](http://www.coconut-palm-software.com/the_new_visual_editor/doku.php?id=blog:simplifying_swt_with_scala)库。 – 2011-05-17 13:19:30

+0

@phineas - 这是Java可以更加简洁的少数几个领域之一。请注意,您给出的示例是一个相当糟糕的封装情况,然而!这是一种代码模式,我会立即将其视为一种“气味” – 2011-05-17 13:20:48

1

您必须分别编写多个作业。正如编译器所说,Scala中的一项任务返回Unit,可以将其视为Java的void

1

你可以做

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=_) 

但这不是单独写的一切显然更糟。但至少你不必在Scala中键入“布局”每次:

val rectangle = new java.awt.Rectangle 
import rectangle._ 
x = 20 
y = 20 
width = 20 
height = 20