Мова програмування vala: делегати і узагальнені класи

Відео: Уроки C #. Делегати і події

делегати
Мова програмування Vala: делегати і узагальнені класи

У Vala і Genie немає покажчиків на функції. Якщо необхідно передати функцію у вигляді параметра іншої функції, то використовуються делегати:
delegate void DelegateType (int a) -
void f1 (int a) {
stdout.printf ( "% dn", a);
}
void f2 (DelegateType d, int a) {
d (a) - // Виклик делегата з переданим параметром
}
void main () {
f2 (f1, 5) - // Функція f1 передається в параметрі-делегата
}

Код з делегатами набагато краще читається, ніж код з покажчиками на функції в С / С ++.




Делегатам можна привласнювати як звичайні, так і анонімні функції:
delegate void PrintIntFunc (int a);
PrintIntFunc p = (a) = gt; stdout.printf ( "% dn", a);
p (20) -

Анонімні функції є замиканнями, т. Е. Вони «пам`ятають» контекст свого створення і можуть звертатися до будь-яких змінним з цього контексту:



delegate int IntOperation (int i) - IntOperation get_adder (int a) {
return (b) = gt; a + b - // `a` - зовнішня змінна J для лямбда-функції
}
void main () {
stdout.printf ( "2 + 4 =% dn", get_adder (2) (4));
}

Тут функція get_adder () повертає делегата, який виробляє складання свого аргументу з «зовнішньої» по відношенню до нього змінної. На відміну від мови D в Vala немає окремих типів для «справжніх замикань» і «чистих» анонімних функцій - все лямбда-функції є замиканнями.

Корисно знати! Деякі умільці примудряються створювати на Vala гри на андроїд (https://androvip.ru/igru-na-adroid/). Якість страждає, але оптимізація знаходиться на досить хорошому рівні і в деякі з них навіть можна грати!

узагальнені класи

Vala підтримує узагальнені класи, т. Е. Класи, які можуть працювати з різними типами даних. Конкретний тип даних вказується при створенні екземпляра класу. Узагальнені класи (Generics) не є повним аналогом шаблонів (Templates) в С ++ або D. Єдине призначення узагальнених класів - уникнути написання одного і того ж коду для декількох типів даних, які обробляються однаковим чином. Узагальнені класи не призначені для шаблонного метапрограмування, як в С ++. Синтаксис узагальнених класів в Vala схожий на шаблони в З ++, але більш простий. Ім`я узагальненого типу задається в кутових дужках:
public class Adder : GLib.Object {private G data- public void do (G a, G b) {this.data = a + b;
}
public G get_sum () {return this.data;
}
}
var v = new Adder() -

Узагальнені класи Vala мають ще одна істотна відмінність від С ++: обмеження типу відбувається на етапі виконання, а не компіляції. Тобто Adder і Adder - об`єкти одного і того ж класу, а не двох різних, як в С ++. Така система більше нагадує узагальнені класи Java.

ІНШЕ

Обробка подій в juce фото

Обробка подій в juce

Відео: Уроки javascript | Урок №13 - Події і обробник подій Переважна більшість тулкіта для С ++ (Gtk +, Qt,…

Мова програмування vala фото

Мова програмування vala

Hello world! Розгляд будь-якої мови програмування традиційно належить починати з найпростішої програми «Hello…

Взаємодія chaiscript з c ++ фото

Взаємодія chaiscript з c ++

Відео: Jason Turner: Why and How To Add ScriptingІдеологія взаємодії ChaiScript і С ++ Скриптова мова ChaiScript…

» » Мова програмування vala: делегати і узагальнені класи