如何在 Vala 中创建异步可变参数函数
How to create an async variadic function in Vala
是否可以在 Vala 中创建异步可变参数函数?如果是,如何?
我在 gnome 网站或任何代码示例中提供的 Vala 教程中找不到任何相关内容。我的结论是不可能,因为 vala 要求异步函数有固定的参数。但是,我不知道如何实现类似于可变参数函数的东西。
代码示例(非异步,正常工作):
void long_function(string first_val, ...) {
var list = va_list();
string? second_val = list.arg();
print("%s,%s\n", first_val, second_val);
}
void main() {
long_function("a", "b");
}
异步代码示例(无效):
async void long_function(string first_val, ...) {
var list = va_list();
string? second_val = list.arg();
print("%s,%s\n", first_val, second_val);
}
void main() {
long_function.begin("a", "b");
}
vala编译器(编译为:vala --pkg gio-2.0 main.vala
)返回的错误是
main.vala:7.28-7.30: error: Argument 2: Cannot convert from `unowned string' to `void GLib.AsyncReadyCallback? (GLib.Object?, GLib.AsyncResult)'
我的真实用例场景是(伪代码):
async void fetch_from_api_with_params(...) {
// ExternalLibrary is a function which accepts a string with a url and any number of POST parameters
ExternalLibrary.fetch_from_url.begin("http://example.com", va_list());
// ...
}
遗憾的是,这对 Vala 来说是不可能的。 Vala 使用 C 的可变参数系统和 GLib 的协程系统。不幸的是,两者并不兼容。根据您的需要,您可以传递 Variant
.
数组
是否可以在 Vala 中创建异步可变参数函数?如果是,如何? 我在 gnome 网站或任何代码示例中提供的 Vala 教程中找不到任何相关内容。我的结论是不可能,因为 vala 要求异步函数有固定的参数。但是,我不知道如何实现类似于可变参数函数的东西。
代码示例(非异步,正常工作):
void long_function(string first_val, ...) {
var list = va_list();
string? second_val = list.arg();
print("%s,%s\n", first_val, second_val);
}
void main() {
long_function("a", "b");
}
异步代码示例(无效):
async void long_function(string first_val, ...) {
var list = va_list();
string? second_val = list.arg();
print("%s,%s\n", first_val, second_val);
}
void main() {
long_function.begin("a", "b");
}
vala编译器(编译为:vala --pkg gio-2.0 main.vala
)返回的错误是
main.vala:7.28-7.30: error: Argument 2: Cannot convert from `unowned string' to `void GLib.AsyncReadyCallback? (GLib.Object?, GLib.AsyncResult)'
我的真实用例场景是(伪代码):
async void fetch_from_api_with_params(...) {
// ExternalLibrary is a function which accepts a string with a url and any number of POST parameters
ExternalLibrary.fetch_from_url.begin("http://example.com", va_list());
// ...
}
遗憾的是,这对 Vala 来说是不可能的。 Vala 使用 C 的可变参数系统和 GLib 的协程系统。不幸的是,两者并不兼容。根据您的需要,您可以传递 Variant
.