2016-02-07 2 views
3

В Валы я вижу, что, когда я объявляю массив я должен указать тип, какМожно ли создать смешанный массив в вале?

int[] myarray = { 1, 2, 3 }; 

Интересно, есть ли способ иметь смешанный массив как

smtg[] myarray = { 1, 'two', 3 }; 

Я вижу, что в this question говорят, что в C++ и C# это невозможно, но я только начал изучать vala, и у меня нет фона с любым C-подобным языком, поэтому я хочу быть уверенным.

ответ

6

No.

Тем не менее, вы можете создать массив что-то, что может содержать другие типы, как GLib.Value или GLib.Variant, и Вала может автоматически конвертировать в/из этих двух, так что вы могли бы сделать что-то вроде

GLib.Value[] values = { 
    1, 
    "two", 
    3.0 
} 

Это, как правило, ужасная идея (вы в основном отбрасываете безопасность времени компиляции), но вы можете это сделать.

+0

Код компилируется. Отлично ... но теперь ... как напечатать такой массив? Я не понимаю, как установить тип элемента в цикле foreach. http://pastebin.com/iZXpgQuK <- Это, очевидно, неправильно – wwr

+0

Я не могу дать полный ответ в этой маленькой коробке, но в основном вам нужно будет сделать что-то вроде 'foreach (значение GLib.Value в значениях) {if (value.holds (typeof (int))) stdout.printf ("% d", (int) value); else if (value.holds (typeof (string))) stdout.printf ("% s", (string) value); }} '. Вероятно, вы также захотите добавить некоторую проверку ошибок, если бы это был тип, которого вы не ожидали. Для GValue существует также механизм преобразования из одного типа в другой, и большинство простых типов должны иметь поддержку для преобразования в строку, встроенную. См. GLib.Value.type_transformable и transform. – nemequ

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