scala为yield设置一个值

时间:2010-03-24 00:58:19

标签: swing scala yield-keyword

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

2 个答案:

答案 0 :(得分:6)

您只需要在c块的末尾返回yield即可获得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
        }

事实上,原始代码在Scala 2.7中没有达到您的预期,因为,范围(如Range中所示)是非严格的。您可以在Stack Overflow或Google上查找,但缺点是每次在d上查找元素时,都会创建一个新的Constraint。 Scala 2.8的此行为已更改。

答案 1 :(得分: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)替换了,但我已经把它还给了直到。两者都是有效的代码,实际上意思相同。