У програмуванні, функція зворотного виклику, або колбек (від англ. callback) є частиною виконуваного коду, що передається як аргумент до іншого коду, який має викликати цей код у відповідь (call back), тобто виконати аргумент у певний момент часу. Виклик функції відбувається для організації дії у відповідь — негайної у випадку синхронної функції зворотного виклику (наприклад, ітерування колекції) або затриманої у випадку асинхронної (наприклад, виклик обробника подій після приходу даних з клавіатури). В усіх випадках намір полягає у тому, щоб вказати функцію або підпрограму як сутність, що, в залежності від мови, може бути більш чи менш схожою на змінну.
Мови програмування підтримують колбеки по-різному, часто реалізуючи їх як підпрограми, анонімні функції, блоки, або вказівники на функції. Часто колбеки використовують, щоб передавати замикання.
Проєктування
Є два типи колбеків, вони відрізняються способом контролю потоку даних під час виконання: блокуючі колбеки (відомі як синхронні колбеки) і відкладені колбеки (також відомі як асинхронні колбеки). У той час, як блокуючі колбеки викликаються перед тим, як функція поверне результат, відкладені колбеки можуть виконуватися вже опісля того, як функція повернула результат. Відкладені колбеки часто використовуються в контексті операцій вводу-виводу або обробки подій і викликаються шляхом переривання одного та більшої кількості потоків чи іншим потоком у випадку багатопотоковості. Відповідно до своєї природи, блокуючі колбеки можуть працювати без переривань чи багатопотоковості, вони рідко використовуються для синхронізації або делегації роботи іншому потокові.
Колбеки використовуються, щоб програмувати у віконних системах. У цьому випадку застосунок надає посилання на певну функцію колбеку, яку має викликати операційна система, яка потім викликає властиві даному застосункові функції у відповідь на події на зразок кліків мишкою чи натискання на клавіші. Тут основною проблемою є керування привілеями та безпекою: у той час, як функція викликається операційною системою, вона не має виконуватися з тими ж привілеями, що й система. Для вирішення цієї проблеми використовуються кільця захисту.
Наочні приклади
Уяви ситуацію: увечері ти маєш зустрітися з друзями у кав'ярні. Оскільки для тебе дуже важливо правильно вибрати столик, то ти кажеш чоловікові (або дружині): по дорозі на роботу зайди до кав'ярні і зателефонуй мені — порадимося щодо столика, коли будеш на місці і по телефону опишеш мені, які столики там є.
Це — приклад колбеку. До функції «вибериСтолик()
» ти додаєш колбек-функцію «порадьсяЗіМноюПоТелефону()
» і ось можливий псевдо-код для цього:
function chooseBestTable( callBack ) { var freeTables = [tableOne, tableTwo, tableThree]; callBack( freeTables ); }
Або: Уяви, що ти печеш паску. Поставила пектися і пішла читати про колбеки, а щоб не проґавити її, ставиш на телефоні нагадування на 30 хвилин: «перевірити духовку». Тут вже маємо приклад колбеку: є процес випікання (немиттєвий), початок цього процесу (функція «початиВипікання()
») і його колбек — твоє нагадування (функція «перевіритиВипікання()
»). Колбек спрацює — і ти перевіриш духовку, можливо, паска вже готова. Без колбеку тобі прийшлося б сидіти усі 30 хвилин над духовкою. З колбеком можна дозволити собі трохи відволіктися і робити інші справи, бо колбек спрацює і нагадає.
Втілення
Форма колбеків може бути різною у різних мовах програмування:
- В assembly, C, , Pascal, Modula2 і подібних до них мовах на машинному рівні передається вказівник на функцію як аргумент іншої (зовнішньої чи внутрішньої) функції. Це підтримується більшістю компіляторів та дає перевагу використання разом різних мов без спеціальних бібліотек чи класів-обгорток. Прикладом може бути Windows API, що більш чи менш напряму доступний з багатьох мов, компіляторів та асемблерів. Зворотньою стороною є те, що програміст має розуміти машинний рівень, також не працює контроль багатьох типів.
- C++ дозволяє об'єктам надавати їх власні реалізації операції виклику функцій. Стандартна бібліотека шаблонів приймає ці об'єкти (що звуться функторами), так само, як і вказівники функцій, як параметри для багатьох поліморфних алгоритмів.
- Багато інтерпретованих мов, на кшталт JavaScript, Lua, Python, Perl та PHP, просто дозволяють передавати об'єкт функції.
- CLI-мови типу C# і VB.NET надають безпечне щодо типів включаюче посилання, «делегата», щоб визначити жорстко-типізований вказівник на функцію. Вони можуть використовуватися як колбеки.
- Події і обробники подій у мовах .NET надають загальний синтаксис колбеків.
- Функціональні мови в цілому підтримують функції першого класу, які можуть передаватися як колбеки до інших функцій, зберігатися як дані або повертатися з функцій.
- Деякі мови, такі як Algol 68, Perl, Python, Ruby, Smalltalk, та пізніші, новіші версії C# та VB.NET, а також більшість функціональних мов, дозволяють неіменованим блокам коду (анонімним функціям) передаватися замість посилань на функції, визначені деінде.
- В деяких мовах, типу Scheme, ML, JavaScript, Perl, Smalltalk, PHP (з версії 5.3.0), C++11 та пізніших, та в багатьох інших, такі функції можуть бути замиканнями, тобто вони можуть використовувати та змінювати ті змінні, що були локально визначені у тому ж контексті, в якому була визначена функція.
- В об'єктно-орієнтованих мовах програмування без функції багатозначних аргументів, як Java до версії 1.7,[citation needed] колбеки можна симулювати, передаючи екземпляр абстрактного класу або інтерфейсу, у якому отримувач викличе один чи більше методів, у той час як той, хто викликає, надає конкретну реалізацію. Такі об'єкти є насправді пачкою колбеків, плюс дані, які вони мають обробити []. Вони корисні у реалізації різних шаблонів дизайну типу Відвідувач, Оглядач, та Стратегія.
Java
public interface CalcCallback { int plus(int x, int y); } public class Test2 { private Test test; public Test2(Test test) { this.test = test; } public void calc() { CalcCallback callback = new CalcCallback() { @Override public int plus(int x, int y) { return x + y; } }; test.calcViaCallback(callback); } } public class Test { int x = 5; int y = 12; public void calcViaCallback(CalcCallback callback) { int sum = callback.plus(x, y); System.out.println(sum); } } public class Main { public static void main(String[] args) { Test test = new Test(); Test2 test2 = new Test2(test); test2.calc(); } }
JavaScript
Колбеки використовуються в мовах подібних до JavaScript, включаючи підтримку функцій як колбеків через js-ctypes і в компонентах типу addEventListener. Ось простий приклад колбеку:
function someAction(x, y, someCallback) { return someCallback(x, y); } function calcProduct(x, y) { return x * y; } function calcSum(x, y) { return x + y; } // alerts 75, the product of 5 and 15 alert(someAction(5, 15, calcProduct)); // alerts 20, the sum of 5 and 15 alert(someAction(5, 15, calcSum));
Спочатку функція someAction
визначається з аргументом-колбеком someCallback
. Потім, як можливий колбек для someAction
, визначається функція calcProduct
. Інші функції також можуть використовуватися для someCallback
, наприклад calcSum
. У цьому прикладі someAction()
викликається двічі: спочатку використовуючи як колбеку calcProduct
, і ще раз — як колбек маючи calcSum
. Функції повертають відповідно добуток та суму, що потім відображаються на екрані за допомогою alert.
У цьому простому прикладі колбеки використовуються переважно для демонстрації принципу. Можна викликати колбеки як звичайні функції: calcProduct(x, y)
. Колбеки корисні тоді, коли функція має виконати дії перед викликом колбека, або коли функція не має (або не може мати) результату для повернення через return, як у випадках асинхронного JavaScript (побудованого на таймерах) або запитів XMLHttpRequest. Корисні приклади можна знайти в бібліотеках JavaScript типу jQuery, де метод each() проходить по об'єкту типу масива, а перший аргумент є колбеком, що виконується на кожній ітерації.
Swift
func relatedValue(value: Bool, callback: Int -> ()) { callback(value ? 150 : 25) } // скорочений вигляд замикання, без захоплення посилання на змінні relatedValue(true) { value in println("result value is: \(value)") } // або relatedValue(true, callback: { value in println("result value is: \(value)") }) // також приклад застосування при ініціалізації об'єкта class A { var someValue: String? init(completion: A -> Void) { completion(self) } } let a = A { $0.someValue = "This is initial value!" }
Scala
def callbackMethod(a: Int, b: Int, c: Int => Unit) = { c(a + b) } callbackMethod(2, 2, { result => println(result) })
C
#include <stdio.h> // В мові С колбеки реалізуються шляхом передачі вказівника на функцію // Визначимо тип callback_t, що являтиме собою вказівник на функцію, що // повертає int і приймає як аргументи два числа типу int typedef int (* callback_t)(int, int); int apply_callback(int x, int y, callback_t some_callback) { return (*some_callback)(x, y); } int add_callback(int x, int y) { return x + y; } int mul_callback(int x, int y) { return x * y; } int main() { printf("10 + 35 = %d\n", apply_callback(10, 35, add_callback)); printf("10 * 35 = %d\n", apply_callback(10, 35, mul_callback)); return 0; }
C#
class CallbackExample { // Ключове слово "delegate" у C# означає, що ви задаєте визначення нового типу. Цей тип наслідується від System.Delegate, котрий надає механізм виклику методів за їх посиланням // Коли ви вказуєте метод, що узгоджується з сигнатурою, визначеною делегатом, як аргумент відповідного типу, буде створено новий екземпляр делегованого типу, всередині якого буде збережено вказівник на переданий метод // Надалі ви можете використовувати цей екземпляр як звичайний метод (метод Calculate добре демонструє це) public delegate int BinaryOperationCallbackDelegate(int operand1, int operand2); // Узгоджується з сигнатурою BinaryOperationCallbackDelegate, тому може використовуватись як аргумент типу BinaryOperationCallbackDelegate public int AddCallback(int operand1, int operand2) { return operand1 + operand2; } // Узгоджується з сигнатурою BinaryOperationCallbackDelegate, тому може використовуватись як аргумент типу BinaryOperationCallbackDelegate public int SubstractCallback(int operand1, int operand2) { return operand1 - operand2; } // Вимагає операнди, потрібні для методів типу BinaryOperationCallbackDelegate і сам метод цього типу для його зворотного виклику public int Calculate(int operand1, int operand2, BinaryOperationCallbackDelegate callback) { int result = callback(operand1, operand2); return result; } } class Program { static void Main(string[] args) { const int operand1 = 10; const int operand2 = 20; CallbackExample callbackExample = new CallbackExample(); Console.WriteLine(callbackExample.Calculate(operand1, operand2, callbackExample.AddCallback)); Console.WriteLine(callbackExample.Calculate(operand1, operand2, callbackExample.SubstractCallback)); Console.ReadLine(); } }
У більшості випадків вам цілком вистачить вбудованих делегатів типу: Action [ 7 липня 2015 у Wayback Machine.], Function [ 7 липня 2015 у Wayback Machine.], Predicate [ 6 липня 2015 у Wayback Machine.]
Python
TODO: Колбеки у Python
def someAction(x, y, someCallback): return someCallback(x, y) def calcProduct(x, y): return x * y def calcSum(x, y): return x + y # виводить 75, добуток 5 та 15 print someAction(5, 15, calcProduct) # виводить 20, суму 5 та 15 print someAction(5, 15, calcSum) # приклад використання лямбда-функцій numbers = [ num for num in range(20) ] # ітерація по списку, і відсіювання елементів відповідно до значення, яке поверне лямбда-функція (предикат) # непарні числа odd_numbers = list(filter(lambda n: n % 2 == 1, numbers)) # парні числа even_numbers = list(filter(lambda n: n % 2 == 0, numbers)) # вивід двох нових списків із відсіяними значеннями print('odd numbers', odd_numbers) print('even numbers', even_numbers)
Ruby
# Викликає переданий блок коду, передаючи вхідний параметр у блок, як вхідний аргумент # Params: # +param+:: параметр, який буде переданий блоку коду def call_block_with_param(param) yield param end # Викликає передану процедуру, передаючи вхідний параметр у неї, як вхідний аргумент # Params: # +param+:: параметр, який буде переданий у процедуру # +procedure+:: +Proc+ процедура, яку потрібно викликати із переданим аргументом def call_proc_with_param(param, procedure) procedure.call param end # Викликає переданий лямбда вираз, передаючи вхідний параметр у неї, як вхідний аргумент # Params: # +param+:: параметр, який буде переданий у лямбду # +lamda+:: лямбда вираз, який потрібно викликати із переданим аргументом def call_lambda_with_param(param, lamda) lamda.call param end call_block_with_param ("Hello") { |param| puts "#{param}" } procedure = Proc.new do |param| puts "#{param}" end call_proc_with_param("Hello", procedure) call_lambda_with_param("Hello", lambda { |param| puts "#{param}" } )
Lua
-- функція, яка опрацьовує елементи переданого їй масиву по черзі, і формує новий масив перетворених функцією callback елементів function processArray(array, callback) local outputTable = {} for i, elem in ipairs(array) do local tmp = callback(elem) table.insert(outputTable, tmp) return outputTable end function square(x) return x * x end local numbers = { 1, 2, 3, 4, 5, 6, 7, 8, 9 } local squares = processArray(numbers, square) for i, number in squares do print(number, ", ") end
Див. також
Зноски
- . Архів оригіналу за 10 квітня 2008. Процитовано 3 березня 2008.
- . Архів оригіналу за 5 липня 2008. Процитовано 3 березня 2008.
- . Архів оригіналу за 4 липня 2015. Процитовано 8 червня 2011.
- . Mozilla Developer Network. Архів оригіналу за 5 листопада 2012. Процитовано 13 грудня 2012.
- . Mozilla Developer Network. Архів оригіналу за 3 листопада 2013. Процитовано 13 грудня 2012.
Посилання
- Style Case Study #2: Generic Callbacks [ 6 жовтня 2010 у Wayback Machine.]
- Implement callback routines in Java [ 16 вересня 2008 у Wayback Machine.]
- (archived from the original on July 6, 2011)
- Callback interface implemented within the operational system [ 12 вересня 2015 у Wayback Machine.]
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
U programuvanni funkciya zvorotnogo vikliku abo kolbek vid angl callback ye chastinoyu vikonuvanogo kodu sho peredayetsya yak argument do inshogo kodu yakij maye viklikati cej kod u vidpovid call back tobto vikonati argument u pevnij moment chasu Viklik funkciyi vidbuvayetsya dlya organizaciyi diyi u vidpovid negajnoyi u vipadku sinhronnoyi funkciyi zvorotnogo vikliku napriklad iteruvannya kolekciyi abo zatrimanoyi u vipadku asinhronnoyi napriklad viklik obrobnika podij pislya prihodu danih z klaviaturi V usih vipadkah namir polyagaye u tomu shob vkazati funkciyu abo pidprogramu yak sutnist sho v zalezhnosti vid movi mozhe buti bilsh chi mensh shozhoyu na zminnu Kolbek chasto povertayetsya na riven togo hto jogo viklikav Movi programuvannya pidtrimuyut kolbeki po riznomu chasto realizuyuchi yih yak pidprogrami anonimni funkciyi bloki abo vkazivniki na funkciyi Chasto kolbeki vikoristovuyut shob peredavati zamikannya ProyektuvannyaYe dva tipi kolbekiv voni vidriznyayutsya sposobom kontrolyu potoku danih pid chas vikonannya blokuyuchi kolbeki vidomi yak sinhronni kolbeki i vidkladeni kolbeki takozh vidomi yak asinhronni kolbeki U toj chas yak blokuyuchi kolbeki viklikayutsya pered tim yak funkciya poverne rezultat vidkladeni kolbeki mozhut vikonuvatisya vzhe opislya togo yak funkciya povernula rezultat Vidkladeni kolbeki chasto vikoristovuyutsya v konteksti operacij vvodu vivodu abo obrobki podij i viklikayutsya shlyahom pererivannya odnogo ta bilshoyi kilkosti potokiv chi inshim potokom u vipadku bagatopotokovosti Vidpovidno do svoyeyi prirodi blokuyuchi kolbeki mozhut pracyuvati bez pererivan chi bagatopotokovosti voni ridko vikoristovuyutsya dlya sinhronizaciyi abo delegaciyi roboti inshomu potokovi Kolbeki vikoristovuyutsya shob programuvati u vikonnih sistemah U comu vipadku zastosunok nadaye posilannya na pevnu funkciyu kolbeku yaku maye viklikati operacijna sistema yaka potim viklikaye vlastivi danomu zastosunkovi funkciyi u vidpovid na podiyi na zrazok klikiv mishkoyu chi natiskannya na klavishi Tut osnovnoyu problemoyu ye keruvannya privileyami ta bezpekoyu u toj chas yak funkciya viklikayetsya operacijnoyu sistemoyu vona ne maye vikonuvatisya z timi zh privileyami sho j sistema Dlya virishennya ciyeyi problemi vikoristovuyutsya kilcya zahistu Naochni prikladiUyavi situaciyu uvecheri ti mayesh zustritisya z druzyami u kav yarni Oskilki dlya tebe duzhe vazhlivo pravilno vibrati stolik to ti kazhesh cholovikovi abo druzhini po dorozi na robotu zajdi do kav yarni i zatelefonuj meni poradimosya shodo stolika koli budesh na misci i po telefonu opishesh meni yaki stoliki tam ye Ce priklad kolbeku Do funkciyi viberiStolik ti dodayesh kolbek funkciyu poradsyaZiMnoyuPoTelefonu i os mozhlivij psevdo kod dlya cogo function chooseBestTable callBack var freeTables tableOne tableTwo tableThree callBack freeTables Abo Uyavi sho ti pechesh pasku Postavila pektisya i pishla chitati pro kolbeki a shob ne progaviti yiyi stavish na telefoni nagaduvannya na 30 hvilin pereviriti duhovku Tut vzhe mayemo priklad kolbeku ye proces vipikannya nemittyevij pochatok cogo procesu funkciya pochatiVipikannya i jogo kolbek tvoye nagaduvannya funkciya pereviritiVipikannya Kolbek spracyuye i ti perevirish duhovku mozhlivo paska vzhe gotova Bez kolbeku tobi prijshlosya b siditi usi 30 hvilin nad duhovkoyu Z kolbekom mozhna dozvoliti sobi trohi vidvoliktisya i robiti inshi spravi bo kolbek spracyuye i nagadaye VtilennyaForma kolbekiv mozhe buti riznoyu u riznih movah programuvannya V assembly C C Pascal Modula2 i podibnih do nih movah na mashinnomu rivni peredayetsya vkazivnik na funkciyu yak argument inshoyi zovnishnoyi chi vnutrishnoyi funkciyi Ce pidtrimuyetsya bilshistyu kompilyatoriv ta daye perevagu vikoristannya razom riznih mov bez specialnih bibliotek chi klasiv obgortok Prikladom mozhe buti Windows API sho bilsh chi mensh napryamu dostupnij z bagatoh mov kompilyatoriv ta asembleriv Zvorotnoyu storonoyu ye te sho programist maye rozumiti mashinnij riven takozh ne pracyuye kontrol bagatoh tipiv C dozvolyaye ob yektam nadavati yih vlasni realizaciyi operaciyi vikliku funkcij Standartna biblioteka shabloniv prijmaye ci ob yekti sho zvutsya funktorami tak samo yak i vkazivniki funkcij yak parametri dlya bagatoh polimorfnih algoritmiv Bagato interpretovanih mov na kshtalt JavaScript Lua Python Perl ta PHP prosto dozvolyayut peredavati ob yekt funkciyi CLI movi tipu C i VB NET nadayut bezpechne shodo tipiv vklyuchayuche posilannya delegata shob viznachiti zhorstko tipizovanij vkazivnik na funkciyu Voni mozhut vikoristovuvatisya yak kolbeki Podiyi i obrobniki podij u movah NET nadayut zagalnij sintaksis kolbekiv Funkcionalni movi v cilomu pidtrimuyut funkciyi pershogo klasu yaki mozhut peredavatisya yak kolbeki do inshih funkcij zberigatisya yak dani abo povertatisya z funkcij Deyaki movi taki yak Algol 68 Perl Python Ruby Smalltalk C 11 ta piznishi novishi versiyi C ta VB NET a takozh bilshist funkcionalnih mov dozvolyayut neimenovanim blokam kodu anonimnim funkciyam peredavatisya zamist posilan na funkciyi viznacheni deinde V deyakih movah tipu Scheme ML JavaScript Perl Smalltalk PHP z versiyi 5 3 0 C 11 ta piznishih ta v bagatoh inshih taki funkciyi mozhut buti zamikannyami tobto voni mozhut vikoristovuvati ta zminyuvati ti zminni sho buli lokalno viznacheni u tomu zh konteksti v yakomu bula viznachena funkciya V ob yektno oriyentovanih movah programuvannya bez funkciyi bagatoznachnih argumentiv yak Java do versiyi 1 7 citation needed kolbeki mozhna simulyuvati peredayuchi ekzemplyar abstraktnogo klasu abo interfejsu u yakomu otrimuvach vikliche odin chi bilshe metodiv u toj chas yak toj hto viklikaye nadaye konkretnu realizaciyu Taki ob yekti ye naspravdi pachkoyu kolbekiv plyus dani yaki voni mayut obrobiti proyasniti Voni korisni u realizaciyi riznih shabloniv dizajnu tipu Vidviduvach Oglyadach ta Strategiya Java public interface CalcCallback int plus int x int y public class Test2 private Test test public Test2 Test test this test test public void calc CalcCallback callback new CalcCallback Override public int plus int x int y return x y test calcViaCallback callback public class Test int x 5 int y 12 public void calcViaCallback CalcCallback callback int sum callback plus x y System out println sum public class Main public static void main String args Test test new Test Test2 test2 new Test2 test test2 calc JavaScript Kolbeki vikoristovuyutsya v movah podibnih do JavaScript vklyuchayuchi pidtrimku funkcij yak kolbekiv cherez js ctypes i v komponentah tipu addEventListener Os prostij priklad kolbeku function someAction x y someCallback return someCallback x y function calcProduct x y return x y function calcSum x y return x y alerts 75 the product of 5 and 15 alert someAction 5 15 calcProduct alerts 20 the sum of 5 and 15 alert someAction 5 15 calcSum Spochatku funkciya someAction viznachayetsya z argumentom kolbekom someCallback Potim yak mozhlivij kolbek dlya someAction viznachayetsya funkciya calcProduct Inshi funkciyi takozh mozhut vikoristovuvatisya dlya someCallback napriklad calcSum U comu prikladi someAction viklikayetsya dvichi spochatku vikoristovuyuchi yak kolbeku calcProduct i she raz yak kolbek mayuchi calcSum Funkciyi povertayut vidpovidno dobutok ta sumu sho potim vidobrazhayutsya na ekrani za dopomogoyu alert U comu prostomu prikladi kolbeki vikoristovuyutsya perevazhno dlya demonstraciyi principu Mozhna viklikati kolbeki yak zvichajni funkciyi calcProduct x y Kolbeki korisni todi koli funkciya maye vikonati diyi pered viklikom kolbeka abo koli funkciya ne maye abo ne mozhe mati rezultatu dlya povernennya cherez return yak u vipadkah asinhronnogo JavaScript pobudovanogo na tajmerah abo zapitiv XMLHttpRequest Korisni prikladi mozhna znajti v bibliotekah JavaScript tipu jQuery de metod each prohodit po ob yektu tipu masiva a pershij argument ye kolbekom sho vikonuyetsya na kozhnij iteraciyi Swift func relatedValue value Bool callback Int gt callback value 150 25 skorochenij viglyad zamikannya bez zahoplennya posilannya na zminni relatedValue true value in println result value is value abo relatedValue true callback value in println result value is value takozh priklad zastosuvannya pri inicializaciyi ob yekta class A var someValue String init completion A gt Void completion self let a A 0 someValue This is initial value Scala def callbackMethod a Int b Int c Int gt Unit c a b callbackMethod 2 2 result gt println result C include lt stdio h gt V movi S kolbeki realizuyutsya shlyahom peredachi vkazivnika na funkciyu Viznachimo tip callback t sho yavlyatime soboyu vkazivnik na funkciyu sho povertaye int i prijmaye yak argumenti dva chisla tipu int typedef int callback t int int int apply callback int x int y callback t some callback return some callback x y int add callback int x int y return x y int mul callback int x int y return x y int main printf 10 35 d n apply callback 10 35 add callback printf 10 35 d n apply callback 10 35 mul callback return 0 C class CallbackExample Klyuchove slovo delegate u C oznachaye sho vi zadayete viznachennya novogo tipu Cej tip nasliduyetsya vid System Delegate kotrij nadaye mehanizm vikliku metodiv za yih posilannyam Koli vi vkazuyete metod sho uzgodzhuyetsya z signaturoyu viznachenoyu delegatom yak argument vidpovidnogo tipu bude stvoreno novij ekzemplyar delegovanogo tipu vseredini yakogo bude zberezheno vkazivnik na peredanij metod Nadali vi mozhete vikoristovuvati cej ekzemplyar yak zvichajnij metod metod Calculate dobre demonstruye ce public delegate int BinaryOperationCallbackDelegate int operand1 int operand2 Uzgodzhuyetsya z signaturoyu BinaryOperationCallbackDelegate tomu mozhe vikoristovuvatis yak argument tipu BinaryOperationCallbackDelegate public int AddCallback int operand1 int operand2 return operand1 operand2 Uzgodzhuyetsya z signaturoyu BinaryOperationCallbackDelegate tomu mozhe vikoristovuvatis yak argument tipu BinaryOperationCallbackDelegate public int SubstractCallback int operand1 int operand2 return operand1 operand2 Vimagaye operandi potribni dlya metodiv tipu BinaryOperationCallbackDelegate i sam metod cogo tipu dlya jogo zvorotnogo vikliku public int Calculate int operand1 int operand2 BinaryOperationCallbackDelegate callback int result callback operand1 operand2 return result class Program static void Main string args const int operand1 10 const int operand2 20 CallbackExample callbackExample new CallbackExample Console WriteLine callbackExample Calculate operand1 operand2 callbackExample AddCallback Console WriteLine callbackExample Calculate operand1 operand2 callbackExample SubstractCallback Console ReadLine U bilshosti vipadkiv vam cilkom vistachit vbudovanih delegativ tipu Action 7 lipnya 2015 u Wayback Machine Function 7 lipnya 2015 u Wayback Machine Predicate 6 lipnya 2015 u Wayback Machine Python TODO Kolbeki u Pythondef someAction x y someCallback return someCallback x y def calcProduct x y return x y def calcSum x y return x y vivodit 75 dobutok 5 ta 15 print someAction 5 15 calcProduct vivodit 20 sumu 5 ta 15 print someAction 5 15 calcSum priklad vikoristannya lyambda funkcij numbers num for num in range 20 iteraciya po spisku i vidsiyuvannya elementiv vidpovidno do znachennya yake poverne lyambda funkciya predikat neparni chisla odd numbers list filter lambda n n 2 1 numbers parni chisla even numbers list filter lambda n n 2 0 numbers vivid dvoh novih spiskiv iz vidsiyanimi znachennyami print odd numbers odd numbers print even numbers even numbers Ruby Viklikaye peredanij blok kodu peredayuchi vhidnij parametr u blok yak vhidnij argument Params param parametr yakij bude peredanij bloku kodu def call block with param param yield param end Viklikaye peredanu proceduru peredayuchi vhidnij parametr u neyi yak vhidnij argument Params param parametr yakij bude peredanij u proceduru procedure Proc procedura yaku potribno viklikati iz peredanim argumentom def call proc with param param procedure procedure call param end Viklikaye peredanij lyambda viraz peredayuchi vhidnij parametr u neyi yak vhidnij argument Params param parametr yakij bude peredanij u lyambdu lamda lyambda viraz yakij potribno viklikati iz peredanim argumentom def call lambda with param param lamda lamda call param end call block with param Hello param puts param procedure Proc new do param puts param end call proc with param Hello procedure call lambda with param Hello lambda param puts param Lua funkciya yaka opracovuye elementi peredanogo yij masivu po cherzi i formuye novij masiv peretvorenih funkciyeyu callback elementiv function processArray array callback local outputTable for i elem in ipairs array do local tmp callback elem table insert outputTable tmp return outputTable end function square x return x x end local numbers 1 2 3 4 5 6 7 8 9 local squares processArray numbers square for i number in squares do print number endDiv takozhZnoski Arhiv originalu za 10 kvitnya 2008 Procitovano 3 bereznya 2008 Arhiv originalu za 5 lipnya 2008 Procitovano 3 bereznya 2008 Arhiv originalu za 4 lipnya 2015 Procitovano 8 chervnya 2011 Mozilla Developer Network Arhiv originalu za 5 listopada 2012 Procitovano 13 grudnya 2012 Mozilla Developer Network Arhiv originalu za 3 listopada 2013 Procitovano 13 grudnya 2012 PosilannyaStyle Case Study 2 Generic Callbacks 6 zhovtnya 2010 u Wayback Machine Implement callback routines in Java 16 veresnya 2008 u Wayback Machine archived from the original on July 6 2011 Callback interface implemented within the operational system 12 veresnya 2015 u Wayback Machine