【问题标题】:What is the syntax for nested generic types in Genie?Genie 中嵌套泛型类型的语法是什么?
【发布时间】:2015-07-11 14:36:53
【问题描述】:

我想声明一个 HasTable,以 string 为键,array of int 为值:

[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

正确的语法是什么?

【问题讨论】:

    标签: generics vala genie


    【解决方案1】:

    错误信息与 vala 不同。

    Genie 的错误信息看起来像是编译器的解析问题。 vala的错误信息更清楚了。

    我在 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
    

    看起来只是不支持“数组”,其他都可以。 'array' 不能是任何容器中的元素(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

    没有正确的语法,它只是不支持。

    【讨论】:

    • 这不完全正确,var h = new HashTable of string, Array of int (str_hash, str_equal) 在 Genie 中工作。所以我一开始就有正确的语法,只是它不适用于简单的数组。
    猜你喜欢
    • 2015-09-14
    • 2018-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-29
    • 1970-01-01
    相关资源
    最近更新 更多