2015-07-11 4 views
1

Я хочу объявить HasTable с string, как это ключ, и array of int, как это значение: сообщениеЧто такое синтаксис для вложенных родовых типов в Genie?

[indent=4] 

init 
    var h = new HashTable of string, array of int (str_hash, str_equal) 
    h["a"] = {1, 2, 3} 
    h["b"] = {5, 6, 7} 

Ошибка:

nested_generic_types.gs:4.27-4.28: error: syntax error, expected line end or semicolon but got `of' 
    var h = new HashTable of string, array of int (str_hash, str_equal) 

Так двойной of кажется запутать valac здесь.

Каков правильный синтаксис?

ответ

1

Сообщение об ошибке отличается от vala.

Сообщение об ошибке Genie выглядит как проблема синтаксического анализа компилятора. Сообщение об ошибке vala более понятно.

мой тест в Вал:

void main() { 
    var h = new HashTable<string, int[]> (str_hash, str_equal); 
} 

сообщения об ошибке:

error: `int[]' is not a supported generic type argument, 
use `?' to box value types 

выглядит просто не поддерживают "массив", а другие все работает. «массив» не может быть элементом в любом контейнере (HashTable, Array, GenericArray, array ..)

какой-либо тест: все работает!

[indent=4] 

init 
    var h = new HashTable of string, HashTable of string, int (str_hash, str_equal) 
    h["a"] = new HashTable of string, int (str_hash, str_equal) 
    h["a"]["b"] = 123 
    stdout.printf ("%d\n", h["a"]["b"]) 

    var a = new HashTable of string, Array of int (str_hash, str_equal) 
    a["a"] = new Array of int 
    // a["a"].append_val (456) 
    // error: lvalue expected 
    var x = 456 
    a["a"].append_val (x) 
    stdout.printf ("%d\n", a["a"].index(0)) 


    var b = new HashTable of string, GenericArray of int (str_hash, str_equal) 
    b["a"] = new GenericArray of int 
    b["a"].add (567) 
    stdout.printf ("%d\n", b["a"].get (0)) 

    var d = new array of Array of int = {new Array of int(), new Array of int} 
    // ERROR IF {new Array of int, new Array of int} 
    var y = 321 
    d[0].append_val (y) 

    stdout.printf ("%d\n", d[0].index(0)) 

объяснение от: http://blog.gmane.org/gmane.comp.programming.vala/month=20140701

Нет правильной Синтекс, он просто не поддерживает это.

+0

Это не совсем правильно, 'var h = new HashTable строки, Array of int (str_hash, str_equal)' работает в Genie. Поэтому у меня был правильный синтаксис, во-первых, это только то, что он не работает с простыми массивами. –