Scala для доходности, устанавливающей значение - PullRequest
3 голосов
/ 24 марта 2010

Я хочу создать список 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 ]

6 голосов
/ 24 марта 2010

Вам просто нужно вернуть 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 голос
/ 24 марта 2010

Попробуйте это:

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), но я вернул его до. Оба кода являются действительными и фактически означают одно и то же.

...