2011-05-17 31 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