3

我想创建一个GridBagPanel.Constraints. 我在 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 值,所以稍后,当我稍后添加组件时,它们将位于网格中。

4

2 回答 2

6

您只需要c在块的末尾返回yield即可获得Constraints. 要让它返回 a List,请使用 aList而不是 a 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
        }

事实上,原始代码不会像您在 Scala 2.7 中所期望的那样,因为那里的范围(如Range)是非严格的。您可以在 Stack Overflow 或 Google 上查找它,但缺点是每次您在 上查找一个元素时d,它都会创建一个新的Constraint. Scala 2.8 的这种行为已经改变。

于 2010-03-24T01:51:02.793 回答
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)

我已经用对函数的调用替换了你的调用。我已将 until 替换为 Iterator.range(0,4) 但我已将其返回到 until。两者都是有效的代码,实际上意味着同样的事情。

于 2010-03-24T01:13:18.237 回答