2010-03-24 5 views
3

Я хочу создать список GridBagPanel.Constraints. Я прочитал его в книге программирования scala, что есть классная конструкция for-yield, но я, вероятно, не понял, как она работает правильно, потому что мой код не компилируется. Вот оно:scala для задания урожайности значение

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

Я хочу, чтобы создать List[Constraints] и для каждого множества ограничений различных х, у значения, так позже, когда я позже добавить компоненты, они собираются быть в сетке.

+0

Все, что вам действительно нужно, это положить старое 'c' в качестве последнего выражения в блоке yield. В Scala присваивания имеют тип Unit (неопределенно 'void'-ish), и каждый блок имеет значение, которое имеет значение последнего выражения, выполняемого внутри него. –

+0

Вы должны отметить ответ Даниила как правильный, а не мой. Как он справедливо указывает на 2.7, он содержит ошибку. – wheaties

ответ

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

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

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'? –

+0

Я писал что-то на Итераторах Scala и Python itertools. пока не будет более кратким. – wheaties

+0

Это не вернет «Список», и, кроме того, он делает неожиданные вещи на Scala 2.7, потому что «Range» там не является строгим. –

Смежные вопросы