Как создать асинхронную переменную функцию в Vala - PullRequest
1 голос
/ 12 марта 2019

Можно ли создать в Vala асинхронную переменную функцию?Если да, то как?Я не смог найти ничего похожего в учебнике по Vala, представленном на сайте gnome или в каком-либо примере кода.Мой вывод заключается в том, что это невозможно, потому что 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());
  // ...
}

1 Ответ

2 голосов
/ 13 марта 2019

К сожалению, это невозможно с Вала. Вала использует систему переменных аргументов C и систему сопутствующих операций GLib. К сожалению, эти два не совместимы. В зависимости от ваших потребностей, вы можете передать массив Variant.

...