vala
English
English
  • Учебник Vala
  • Основы
    • Элементы языка
      • Типы данных
      • Управляющие конструкции
      • Методы
      • Делегаты
      • Лямбды / Замыкания
      • Пространства имён
      • Структуры
      • Классы
    • ООП
      • Основы
      • Конструктор
      • Деструктор
      • Сигналы
      • Свойства(Properties)
      • Наследование
      • Абстрактные классы
      • Интерфейсы / Миксины
      • Полиморфизм
      • Сокрытие методов
      • Информация о типах времени выполнения(Run-Time Type Information)
      • Динамическое приведение типов(Dynamic Type Casting)
      • Универсальные шаблоны(Generics)
      • Создание объектов в стиле GObject
      • Интеграция с D-Bus
      • Профили(Другие бэкенды помимо GLib)
  • Продвинутые возможности
    • Ассерты и контрактное программирование
    • Обработка ошибок
    • Управление параметрами
    • Методы с поддержкой синтаксиса
    • Многопоточность
    • Главный цикл(The Main Loop)
    • Асинхронные методы(Coroutine)
    • Слабые ссылки(Weak References)
    • Список аргументов переменной длины
    • Указатели
    • Классы не наследующие Object
    • Коллекции
      • Введение
      • HashSet<G>
      • ArrayList<G>
      • HashMap<K,V>
      • Lock-free структуры
  • Экспериментальные фичи
    • Введение
    • Строгий не null режим(Rust mode)
    • Литералы регулярных выражений(regexp)
    • Цепочки связанных выражений
  • Использование и создание библиотек
    • Введение
    • Инструменты
    • Генерирование VAPI файла из предыдущего с помощью vapigen.
    • Использование библиотек
    • Создание библиотеки
    • Vala and C
    • Meson
      • Config file
      • Static Library
      • Shared Library
      • Target GLib Version
  • Технические приёмы
    • Unit тестирование
    • Отладка
    • Использование GLib
  • Продвинуты гайд(WIP)
  • Functional Programming
    • Gpseq
    • Compose
  • Examples
    • Basic
    • GTK
      • Базовые GTK программы
      • Flappy Bird(WIP)
      • DnD
    • Websocket
  • Apps
    • Games
  • Meson-Book
    • MesonBook
    • Wrap
    • Crosscompile
    • Object files
    • Library
    • Executable
    • Code Generation
    • Installing
    • Unit Tests
    • Meson 0.54
    • Meson 0.53
  • golang-book
    • Ваша первая программа
    • Типы
    • UPDATE.MD
Powered by GitBook
On this page

Was this helpful?

  1. Основы
  2. Элементы языка

Лямбды / Замыкания

(a) => { stdout.printf("%d\n", a); }

Анонимный метод, также известный, как лямбда-выражение, функциональный литерал или замыкание, может быть определен в Vala при помощи оператора =>. Список параметров должен находиться слева от оператора, а тело метода - справа.

Анонимный метод сам по себе не имеет смысла. Он полезен только если вы присваиваете его переменной типа делегат или передаете его в качестве аргумента в другой метод.

Обратите внимание, что ни тип параметра ни тип возвращаемого значения не заданы явно. Вместо этого типы определяются по сигнатуре делегата, которому присваивается метод.

Присваивание анонимного метода делегату.

delegate void PrintIntFunc(int a);

void main() {
    PrintIntFunc p1 = (a) => { stdout.printf("%d\n", a); };
    p1(10);

    // Фигурные скобки не обязательны, если тело содержит одно выражение.
    PrintIntFunc p2 = (a) => stdout.printf("%d\n", a);
    p2(20):
}

Пересылка анонимных методов в другие методы:

delegate int Comparator(int a, int b);

void my_sorting_algorithm(int[] data, Comparator compare) {
    // ... 'сравнение' происходит где-то здесь ...
}

void main() {
    int[] data = { 3, 9, 2, 7, 5 };
    // Анонимный метод передается в качестве второго аргумента:
    my_sorting_algorithm(data, (a, b) => {
        if (a < b) return -1;
        if (a > b) return 1;
        return 0;
    });
}

Анонимные методы поддерживают замыкания. Это значит, что вы можете получить доступ к переменным внешнего метода, внутри лямбда-выражения:

delegate int IntOperation(int i);

IntOperation curried_add(int a) {
    return (b) => a + b;  //  'a' - внешняя переменная
}

void main() {
    stdout.printf("2 + 4 = %d\n", curried_add(2)(4));
}

В этом примере curried_add (смотрите Каррирование) возвращает новосозданный метод, который сохраняет значение a. Это возвращённый метод вызывается затем с аргументом 4, выдавая в качестве результата сумму двух чисел.

PreviousДелегатыNextПространства имён

Last updated 6 years ago

Was this helpful?