具有静态结构的 Vala 代码在更新到 0.44 后不起作用

Vala code with static struct dont works after update to 0.44

刚刚做了一个标准的求职面试,就是计算直方图中的水量。星期一,此代码有效,并且 still works 在此站点上。更新vala后,现在显示错误。

UPD:更简单 example

> Algoritm.vala:2.5-2.16: error: struct `Algotitm.first' cannot be empty
>     struct first {
>     ^^^^^^^^^^^^ Algoritm.vala:6.5-6.17: error: struct `Algotitm.second' cannot be empty
>     struct second {

当 post 在 Stack Overflow 上提出问题时,post 一个 minimum, complete and verifiable example.

的代码示例总是好的

从您提供的 link 来看,您的结构似乎只有成员标记为 static:

struct First {
    static int data;
    static int pos; 
}

void main () {
}

将字段标记为 static 意味着它们不是实例字段,因此结构中没有字段。这就是为什么您收到有关结构为空的错误消息的原因。我不确定 Vala 是否应该允许将结构字段标记为静态,但允许结构中的方法是静态的确实有意义。

您需要删除 static 修饰符。这将起作用:

struct First {
    int data;
    int pos;
}

void main () {
}

更新

我猜您正在尝试编写性能优化的代码,并且您认为 static 对此有所帮助。 static 在 Vala 中表示没有可用的实例数据。如果您使用的是 class 或结构之类的数据结构,那么只有拥有这些实例才有意义。如果您希望在程序的 运行 期间保持不变,请在命名空间中使用 const

如果您在程序中使用非常大的数字,使用结构可能会给您带来轻微的性能提升。在 Vala 中创建的结构分配在栈上而不是堆上,因此可能稍微快一些。如果您正在传递结构,您可能需要考虑 [SimpleType] 属性。这意味着结构将在 C 和 Vala 中按值传递。如果没有 [SimpleType],它们将在 C 级别通过引用进行复制和传递,这在 Vala 中显示为按值复制。

Vala 中的结构可以有初始化器(类似于 class 的构造器)和方法。所以我可以从你的第二个 pastebin 中提取什么你可以写成:

struct First {
    int data;
    int pos;

    public First (int[] mass) {
        data= 5;
        pos = mass.length;
    }

    public int sas () {
        return data + pos;
    }
}

void main () {
    int[] a = {1,3,0,1,2,3,2,1};
    var b = First (a);
    print (@"$(b.sas ())\n");
}

虽然这是一个后续问题,但应该作为 Stack Overflow 上的第二个问题提出。这是一个 public 论坛,其格式允许其他人从问题和答案中学习。