2013-11-21 6 views
1

Скажем, у меня есть черта, Foo и эта черта имеет общий тип Bar так, что определение Foo будет выглядеть так же, какмногомерные рваный массив типа, который расширяет общий признак

trait Foo[C <: Bar] { 
    def updateState(state : C) : C; 
} 

, и у меня есть несколько классы action1, action2, action3 ... action9 которые распространяются Foo.

Теперь предположим, что я хочу явно инициализировать 2d-массив этих действий.

Я попытался

Array[Foo[Bar]](
Array(new action1, new action2), 
Array(new action2, new action3)... 
) 
Array[Foo[Bar]](
Array[Foo[Bar]](new action1, new action2), 
Array[Foo[Bar]](new action2, new action3)... 
) 

и большинство перестановок добавления [Foo[Bar]] с баром [Foo] без бара, делая основной массив Array[Array[Foo[Bar]]] и т.д.

Я нашел решение проблемы используя

Array.ofDim[Foo[Bar]](size1, size2, size3) 

и вручную инициализировать каждое измерение, но я хотел бы знать, есть ли какой-либо способ для расширения citly инициализировать массив 2d типа, который реализует общий признак ... да, я знаю, что для этого есть около 3 случаев использования (не совсем, но это не очень часто), так что ответ вроде: «Зачем вы это делаете?» или «Есть лучшие способы бла-бла-бла», это не повлияет на меня.

ответ

1

Если вы можете определить соотношение между индексом элемента и экземпляра класса, чем пользы:

tabulate[T](n1: Int, n2: Int)(f: (Int, Int) ⇒ T) 

Пример:

Array.tabulate(5, 5) { 
    case (i, j) => new action(i, j) 
} 

Update:

scala> :paste 
// Entering paste mode (ctrl-D to finish)  
trait Bar 
class Foo[C <: Bar] 

Array.tabulate(5, 5) { 
    case (i, j) => new Foo[Bar]() 
} 

// Exiting paste mode, now interpreting. 

defined trait Bar 
defined class Foo 
res1: Array[Array[Foo[Bar]]] = Array(Array([email protected], [email protected], [email protected], [email protected], [email protected]), Array([email protected], [email protected], [email protected], [email protected], [email protected]), Array([email protected], [email protected], [email protected], [email protected], [email protected]), Array([email protected], [email protected], [email protected], [email protected], [email protected]), Array([email protected], [email protected], [email protected], [email protected], [email protected])) 
+0

Не могли бы вы сделать 2-мерный оборванный массив '[Foo [Bar]]', используя это? Я не понимаю, как вы можете объяснить свое объяснение или код. –

+0

@ theSilentOne Сообщение обновлено с выходом консоли. – Yuriy

+0

Очень приятно, спасибо. –

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