Функция обратного вызова в xtend

Как я могу вызвать функцию обратного вызова в xtend?

Я ищу что-то похожее на то, что в C. Пример:

    struct callbacks
    {
      char name[10];
      boolean (*pfState)();
    };

    static const struct callbacks call[] = {
      {"YOURS", &isOwner},
      {"OURS", &our_owner}
    };

Итак, я назову это так: call[0].pfState().

Я создал аналогичный ArrayList в xtend.

    val you = new youModule()
    val our = new ourModule()
    val callbacks = newArrayList('YOURS' -> you.isOwner, 'OURS' -> our.isOwnder);

Я делаю это правильно? Как я могу выполнить вызов функции в паре?


person chris yo    schedule 12.07.2013    source источник


Ответы (2)


В настоящее время вы создаете список пар, которые сопоставляют строки с результатом вызова метода, например. предполагая, что #isOwner возвращает boolean, ваш список обратных вызовов в настоящее время является List<Pair<String, Boolean>>.

Вместо этого вам нужно обернуть вызов #isOwner лямбда-выражением:

val callbacks = newArrayList(
  'YOURS' -> [| you.isOwner ],
  'OURS' -> [| our.isOwnder ]
);

Теперь обратные вызовы имеют тип List<Pair<String, ()=>boolean>>, или другими словами: List<Pair<String, Functions.Function0<Boolean>>>.

person Sebastian Zarnekow    schedule 12.07.2013
comment
Я получаю сообщение об ошибке с вашей реализацией. Несовместимый неявный возвращаемый тип. Ожидаемый java.util.ArrayList‹java.util.List‹java.lang.Object›› или java.util.List‹java.lang.Object›[], но был java.util.ArrayList‹org.eclipse.xtext.xbase .lib.Pair‹java.lang.String, org.eclipse.xtext.xbase.lib.Functions.Function0‹java.lang.Boolean››› Что такое | и для? - person chris yo; 15.07.2013

Если у вас есть «обратный вызов», хранящийся в переменной, вам нужно вызвать функцию, вызвав для нее apply.

Вот простой пример, показывающий хэш-карту, содержащую два обратных вызова, хранящихся под ключами YOURS и OURS. При вызове каждая функция обратного вызова печатает другое сообщение и возвращает логическое значение.

    val callbacks = newHashMap(
      'YOURS' -> [| println("calling the first callback");  true  ],
      'OURS'  -> [| println("calling the second callback"); false ]
    )

    val result = callbacks.get("YOURS").apply

// result is: true
// console output is: calling the first callback
person Viliam Simko    schedule 12.11.2014