2010-03-24 23 views
3

我想創建一個GridBagPanel.Constraints的列表。我在scala編程書中讀到它,有一個很酷的for-yield構造,但我可能還沒有理解它的正確工作方式,因爲我的代碼不能編譯。那就是:scala for yield設置值

 val d = for { 
      i <- 0 until 4 
      j <- 0 until 4 
     } yield { 
      c = new Constraints 
      c.gridx = j 
      c.gridy = i 
     } 

我想生成一個List[Constraints],併爲每一個約束設置不同的X,Y值,因此以後,當我後來添加的成分,他們要在一個網格。

+0

您真正需要的是將一個普通的'c'作爲yield塊中的最後一個表達式。在Scala中,賦值語句的類型爲Unit(隱含'void'-ish),每個塊都有一個值,它是在其中執行的最後一個表達式的值。 – 2010-03-24 01:33:27

+0

你應該將Daniel的答案標記爲正確的,而不是我的。正如他正確地指出2.7它包含一個錯誤。 – wheaties 2010-03-24 02:06:13

回答

6

您只需在yield塊的末尾返回c即可獲得Constraints的集合。要使它返回List,請使用List而不是Range。就像這樣:

val d = for { 
      i <- List.range(0, 4) 
      j <- List.range(0, 4) 
     } yield { 
      c = new Constraints 
      c.gridx = j 
      c.gridy = i 
      c 
     } 

事實上,原來的代碼不會做你希望它在斯卡拉2.7,因爲在那裏,範圍(如Range)是不嚴格的。您可以在Stack Overflow或Google上查找它,但缺點是每次在d上查找元素時,都會創建一個新的Constraint。這種行爲已經改變了Scala 2.8。

1

試試這個:

def conCreate = { 
    val c = new Constraints 
    c.gridx = j 
    c.gridy = i 
    c 
} 

val d = for(i <- 0 until 4; 
      j <- 0 until 4) yield conCreate(i,j) 

我換成一個函數的調用你的電話。我已經更換,直到與Iterator.range(0,4),但我已經回到它。兩者都是有效的代碼,實際上意味着同樣的事情。

+0

你發現'Iterator.range(0,4)'比'0直到4'更具可讀性嗎? – 2010-03-24 01:32:24

+0

我一直在Scala Iterators和Python itertools上寫一些東西。直到更簡潔。 – wheaties 2010-03-24 01:37:29

+0

這將不會返回一個'List',並且此外,它會在Scala 2.7上做出意想不到的事情,因爲'Range'在那裏並不嚴格。 – 2010-03-24 01:51:59

相關問題