如何在 Vala 中使用 lambda
How to cast lambda in Vala
不断接收来自 cc
(而非 valac
)的编译时警告。试图投射 lambda,但不知道如何投射。我是 Vala 的新手。希望有人能帮忙。非常感谢。下面的代码是一个示例,其中 cc
会抱怨 lambda 的类型不正确,即方法 foreach
的参数。我使用的 Vala 是 0.36.1 版,cc
是 4.9.2 版。
public static int main(string[] args)
{
var hash = new GLib.HashTable<string, string>(GLib.str_hash, GLib.str_equal);
hash.insert("one", "apple");
hash.insert("two", "banana");
hash.insert("three", "cherry");
hash.foreach((key, val)=>stdout.printf("%s => %s\n", key, val));
return 0;
}
只要
您就可以安全地忽略来自 C 编译器的警告
您不是自己编写 VAPI 绑定。然后你应该确保尽可能少的 C 警告。
它们不是错误,但无论如何您都无法创建二进制文件。
我通常将“-X -w”传递给 vala 编译器以抑制 C 警告。
无论如何让我们看看你的具体例子,我收到这个警告(GCC 6.3.0 on MSYS2 64-Bit Windows):
d:/msys64/home/Admin/hash-test.vala.c: In function '_vala_main':
d:/msys64/home/Admin/hash-test.vala.c:69:30: warning: passing argument 2 of 'g_hash_table_foreach' from incompatible pointer type [-Wincompatible-pointer-types]
g_hash_table_foreach (hash, ___lambda4__gh_func, NULL);
^~~~~~~~~~~~~~~~~~~
In file included from D:/msys64/mingw64/include/glib-2.0/glib.h:50:0,
from d:/msys64/home/Admin/hash-test.vala.c:5:
D:/msys64/mingw64/include/glib-2.0/glib/ghash.h:99:13: note: expected 'GHFunc {aka void (*)(void *, void *, void *)}' but argument is of type 'void (*)(const void *, const void *, void *)'
void g_hash_table_foreach (GHashTable *hash_table,
^~~~~~~~~~~~~~~~~~~~
重要的是这一点(为了更好地比较,我将其对齐):
expected 'GHFunc {aka void (*)( void *, void *, void *)}'
but argument is of type 'void (*)(const void *, const void *, void *)'
所以这是一个经典的 const correctnes 警告。
lambda 有两个 const 参数,但是 g_hash_table_foreach
的函数指针类型 (GHFunc) 是用更宽松的非常量指针声明的。
这应该不是问题,因此您可以放心地忽略它。
不断接收来自 cc
(而非 valac
)的编译时警告。试图投射 lambda,但不知道如何投射。我是 Vala 的新手。希望有人能帮忙。非常感谢。下面的代码是一个示例,其中 cc
会抱怨 lambda 的类型不正确,即方法 foreach
的参数。我使用的 Vala 是 0.36.1 版,cc
是 4.9.2 版。
public static int main(string[] args)
{
var hash = new GLib.HashTable<string, string>(GLib.str_hash, GLib.str_equal);
hash.insert("one", "apple");
hash.insert("two", "banana");
hash.insert("three", "cherry");
hash.foreach((key, val)=>stdout.printf("%s => %s\n", key, val));
return 0;
}
只要
您就可以安全地忽略来自 C 编译器的警告您不是自己编写 VAPI 绑定。然后你应该确保尽可能少的 C 警告。
它们不是错误,但无论如何您都无法创建二进制文件。
我通常将“-X -w”传递给 vala 编译器以抑制 C 警告。
无论如何让我们看看你的具体例子,我收到这个警告(GCC 6.3.0 on MSYS2 64-Bit Windows):
d:/msys64/home/Admin/hash-test.vala.c: In function '_vala_main':
d:/msys64/home/Admin/hash-test.vala.c:69:30: warning: passing argument 2 of 'g_hash_table_foreach' from incompatible pointer type [-Wincompatible-pointer-types]
g_hash_table_foreach (hash, ___lambda4__gh_func, NULL);
^~~~~~~~~~~~~~~~~~~
In file included from D:/msys64/mingw64/include/glib-2.0/glib.h:50:0,
from d:/msys64/home/Admin/hash-test.vala.c:5:
D:/msys64/mingw64/include/glib-2.0/glib/ghash.h:99:13: note: expected 'GHFunc {aka void (*)(void *, void *, void *)}' but argument is of type 'void (*)(const void *, const void *, void *)'
void g_hash_table_foreach (GHashTable *hash_table,
^~~~~~~~~~~~~~~~~~~~
重要的是这一点(为了更好地比较,我将其对齐):
expected 'GHFunc {aka void (*)( void *, void *, void *)}'
but argument is of type 'void (*)(const void *, const void *, void *)'
所以这是一个经典的 const correctnes 警告。
lambda 有两个 const 参数,但是 g_hash_table_foreach
的函数指针类型 (GHFunc) 是用更宽松的非常量指针声明的。
这应该不是问题,因此您可以放心地忽略它。