精灵HashTable的字符串,STRUCT

时间:2015-07-11 06:30:29

标签: hashtable vala genie

注意:我的问题是数组,而不是[Array或GenericArray] 这是我的代码:

init
    var h = new HashTable of string, Int? (str_hash, str_equal)
    h["a"] = Int ({1, 2, 3})
    h["b"] = Int ({5, 6, 7})    // HERE: WORKS FINE 
    // ERROR HERE: 
    // Array concatenation not supported for public array variables and parameters
    h["a"].data += 4

struct Int
    data: array of int
    construct (a: array of int)
        this.data = a

如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

不是一个真正的答案,而是另一种表达方式:

init
    var h = new HashTable of string, Int? (str_hash, str_equal)
    h["a"] = Int ({1, 2, 3})
    h["b"] = Int ({5, 6, 7})
    h["a"].append ({4})

struct Int
    data: array of int
    construct (a: array of int)
        this.data = a
    def append (a: array of int)
        this.data = this.data + a

现在没有"变量和参数的混合"继续,这解决了原始代码触发的编译器错误。

问题是这也会导致编译错误:

resize_array.gs:14.21-14.33: error: Incompatible operand
        this.data = this.data + a

可以简化为此代码:

init
    x: array of int = {1, 2, 3}
    y: array of int = {4, 5, 6}
    z: array of int = x + y

这也会产生相同的编译错误。

resize_array.gs:21.23-21.27: error: Incompatible operand
    z: array of int = x + y

我在此基础上添加了一个新问题:

How to concatenate two arrays?

事实证明,对于数组(它虽然适用于字符串!)在Vala / Genie中并不是一项简单的任务。

有关如何执行此操作的解决方案,请参阅另一个问题。

我个人使用Gee个容器(如果我不经常调用一些需要普通数组的C函数)。

使用Array of int的解决方案:

init
    var h = new HashTable of string, Int? (str_hash, str_equal)
    h["a"] = Int ({1, 2, 3})
    h["b"] = Int ({5, 6, 7})
    h["a"].append ({4})

struct Int
    data: Array of int
    construct (a: array of int)
        data = new Array of int;
        append (a)
    def append (a: array of int)
        data.append_vals (a, a.length)

答案 1 :(得分:0)

精灵的错误?可能?

我在Vala中尝试过,工作正常。

输出:

  

1,2,3,4,55,666,

struct Int {
        int[] data;
        Int(int[] a){
                this.data = a;
        }
}

void main(){
        var h = new HashTable<string, Int?> (str_hash, str_equal);
        h["a"] = Int({1, 2, 3});
        h["b"] = Int({4, 5, 6});

        h["a"].data += 4;
        h["a"].data += 55;
        h["a"].data += 666;

        for (var i = 0; i < h["a"].data.length; i++) {
                stdout.printf("%d, ", h["a"].data[i]);
        }
}