为什么 GLib 中的 Array 不能与 Vala 中的 int 一起使用?
Why doesn't Array from GLib work with int in Vala?
这是 https://valadoc.org/glib-2.0/GLib.Array.html 的示例,但不是字符串 int 而是抛出 C 错误。
int main(){
Array<int> array = new Array<int> ();
array.append_val (3);
array.append_val (4);
return 0;
}
错误:
In file included from/usr/include/glib-2.0 / glib.h: 31.,
from/tmp / algorithm2.vala.JWAGYZ.c: 4:
/ tmp / algorithm2.vala.JWAGYZ.c: in the function " _vala_main»:
/usr/include/glib-2.0/glib / garray.h: 64:59: error: unary operation operand ' & ' must be an lvalue expression
64 | #define g_array_append_val(a, v) g_array_append_vals (a, &(v), 1)
/ ^
/ tmp / algorithm2.vala.JWAGYZ.c: 53:2: note: in the macro extension "g_array_append_val»
53 | g_array_append_val (array, 3);
| ^~~~~~~~~~~~~~~~~~
/usr/include/glib-2.0/glib / garray.h: 64:59: error: unary operation operand ' & ' must be an lvalue expression
64 | #define g_array_append_val(a, v) g_array_append_vals (a, &(v), 1)
/ ^
/ tmp / algorithm2.vala.JWAGYZ.c: 54:2: note: in the macro extension "g_array_append_val»
54 / g_array_append_val (array, 4);
| ^~~~~~~~~~~~~~~~~~
error: cc exited with status 256
首先尝试将整数分配给中间变量。 Vala 不会自动执行此操作的事实是一个 Vala 错误,您应该 report upstream.
Vala 0.44 版本的临时答案,直到您更正错误:
int main(){
Array<int> array = new Array<int> ();
int a = 3, b = 4;
array.append_val (a);
array.append_val (b);
for (int i = 0; i < array.length ; i++) {
print ("%d\n", array.index (i));
}
return 0;
}
Vala 泛型的底层实现是基于 C 指针的。 int
是一个值类型而不是引用类型,并且不适合 Vala 中的当前实现。一种解决方案是通过 'boxing' 将 int
转换为引用类型。这基本上使它成为可空类型:int?
。所以这有效:
int main(){
Array<int?> array = new Array<int?> ();
array.append_val (3);
array.append_val (4);
return 0;
}
目前正在进行一些工作,以使 Vala 编译器适应使用值类型的简单泛型。参见 Vala merge request #52。
对于 GArray,g_array_append_val()
是一个宏,文档建议该值必须是对该值的引用。
这是 https://valadoc.org/glib-2.0/GLib.Array.html 的示例,但不是字符串 int 而是抛出 C 错误。
int main(){
Array<int> array = new Array<int> ();
array.append_val (3);
array.append_val (4);
return 0;
}
错误:
In file included from/usr/include/glib-2.0 / glib.h: 31.,
from/tmp / algorithm2.vala.JWAGYZ.c: 4:
/ tmp / algorithm2.vala.JWAGYZ.c: in the function " _vala_main»:
/usr/include/glib-2.0/glib / garray.h: 64:59: error: unary operation operand ' & ' must be an lvalue expression
64 | #define g_array_append_val(a, v) g_array_append_vals (a, &(v), 1)
/ ^
/ tmp / algorithm2.vala.JWAGYZ.c: 53:2: note: in the macro extension "g_array_append_val»
53 | g_array_append_val (array, 3);
| ^~~~~~~~~~~~~~~~~~
/usr/include/glib-2.0/glib / garray.h: 64:59: error: unary operation operand ' & ' must be an lvalue expression
64 | #define g_array_append_val(a, v) g_array_append_vals (a, &(v), 1)
/ ^
/ tmp / algorithm2.vala.JWAGYZ.c: 54:2: note: in the macro extension "g_array_append_val»
54 / g_array_append_val (array, 4);
| ^~~~~~~~~~~~~~~~~~
error: cc exited with status 256
首先尝试将整数分配给中间变量。 Vala 不会自动执行此操作的事实是一个 Vala 错误,您应该 report upstream.
Vala 0.44 版本的临时答案,直到您更正错误:
int main(){
Array<int> array = new Array<int> ();
int a = 3, b = 4;
array.append_val (a);
array.append_val (b);
for (int i = 0; i < array.length ; i++) {
print ("%d\n", array.index (i));
}
return 0;
}
Vala 泛型的底层实现是基于 C 指针的。 int
是一个值类型而不是引用类型,并且不适合 Vala 中的当前实现。一种解决方案是通过 'boxing' 将 int
转换为引用类型。这基本上使它成为可空类型:int?
。所以这有效:
int main(){
Array<int?> array = new Array<int?> ();
array.append_val (3);
array.append_val (4);
return 0;
}
目前正在进行一些工作,以使 Vala 编译器适应使用值类型的简单泛型。参见 Vala merge request #52。
对于 GArray,g_array_append_val()
是一个宏,文档建议该值必须是对该值的引用。