Най-често срещана конструкция в a Delphi приложението ще бъде a процедура или функция. Известни като рутинни процедури, процедури или функции са блокове на оператори, които извиквате от различни места в програмата.
Просто казано, процедурата е рутина, която не връща стойност, докато функция връща стойност.
Връщане на стойност от функция се определя от типа връщане. В повечето случаи бихте написали функция на върнете единична стойност това ще бъде цяло число, низ, булев или някакъв друг прост тип, също връщащите типове могат да бъдат масив, списък с низове, екземпляр на персонализиран обект или подобен.
Обърнете внимание, че дори ако функцията ви връща списък с низове (колекция от струни) тя все още връща една стойност: един екземпляр от списъка с низове
Освен това рутинните програми на Delphi наистина могат да имат много лица: рутинна, метод, указател на метод, делегат на събития, анонимен метод ...
Може ли функция да върне множество стойности?
Първият отговор, който идва на ум, е не, просто защото, когато мислим за функция, ние мислим за една единствена възвръщаема стойност.
Със сигурност отговорът на горния въпрос е, обаче, да. Функцията може да върне няколко стойности. Да видим как.
Var Параметри
Колко стойности могат да върнат следната функция, една или две?
функция PositiveReciprocal (конст valueIn: цяло число; Var valueOut: истински): boolean;
Функцията очевидно връща булева стойност (вярна или невярна). Какво ще кажете за втория параметър "valueOut", деклариран като параметър "VAR" (променлива)?
Var параметри се предават на функцията чрез справка което означава, че ако функцията промени стойността на параметъра - променлива в извикващия блок от код, функцията ще промени стойността на променливата, използвана за параметъра.
За да видите как работи по-горе, ето изпълнението:
функция PositiveReciprocal (конст valueIn: цяло число; Var valueOut: истински): boolean;
започвам
резултат: = valueIn> 0;
ако доведе до тогава valueOut: = 1 / valueIn;
край;
„ValueIn“ се предава като постоянен параметър - функцията не може да го промени и се третира като само за четене.
Ако "valueIn" или е по-голямо от нула, параметърът "valueOut" се назначава реципрочна стойност на "valueIn" и резултатът от функцията е истина. Ако valueIn е <= 0, функцията връща false и "valueOut" не се променя по никакъв начин.
Ето използването:
Var
б: булева;
r: истински;
започвам
r: = 5;
b: = положителна реципрочност (1, r);
//here:
// b = true (тъй като 1> = 0)
// r = 0,2 (1/5)
r: = 5;
b: = положителна реципрочност (-1, r);
//here:
// b = false (тъй като -1
край;
Следователно, PositiveReciprocal всъщност може да "върне" 2 стойности! Използвайки параметрите на var, можете да имате рутинно връщане на повече от една стойност.
Извън параметри
Има и друг начин да посочите параметър по референция - използвайки ключовата дума "out", както в:
функция PositiveReciprocalOut (конст valueIn: цяло число; от valueOut: истински): boolean;
започвам
резултат: = valueIn> 0;
ако доведе до тогава valueOut: = 1 / valueIn;
край;
Внедряването на PositiveReciprocalOut е същото като в PositiveReciprocal, има само една разлика: „valueOut“ е параметър OUT.
При параметри, декларирани като „вън“, първоначалната стойност на референтната променлива „valueOut“ се отхвърля.
Ето използването и резултатите:
Var
б: булева;
r: истински;
започвам
r: = 5;
b: = PositiveReciprocalOut (1, r);
//here:
// b = true (тъй като 1> = 0)
// r = 0,2 (1/5)
r: = 5;
b: = PositiveReciprocalOut (-1, r);
//here:
// b = false (тъй като -1
край;
Обърнете внимание как във второто повикване стойността на локалната променлива "r" е зададена на "0". Стойността на "r" е зададена на 5 преди извикването на функцията, но тъй като параметърът в деклариран като "вън", когато "r" достига функцията, стойността е отхвърлена и по подразбиране е зададена стойност за "празно" за параметъра (0 за реално Тип).
В резултат на това можете безопасно да изпращате неинициализирани променливи за параметри - нещо, което не бива да правите с параметрите "var". Параметрите се използват за изпращане на нещо към рутината, освен тук с параметри "out" :) и следователно неинициализирани променливи (използвани за VAR параметри) биха могли да имат странни стойности.
Връщане на записи?
Горните реализации, при които дадена функция би върнала повече от една стойност, не са хубави. Функцията всъщност връща единична стойност, но също така връща, по-добре да се променя, стойностите на параметрите var / out.
Поради това може много рядко да искате да използвате параметри за справка. Ако са необходими повече резултати от дадена функция, можете да имате функция за връщане a тип запис променлива.
Помислете следното:
Тип
TLatitudeLongitude = рекорд
Широта: истинска;
Географска дължина: истинска;
край;
и хипотетична функция:
функция Къде съм(конст townName: низ): TLatitudeLongitude;
Функцията WhereAmI би върнала Географска ширина и дължина за даден град (град, област, ...).
Изпълнението ще бъде:
функция Къде съм(конст townName: низ): TLatitudeLongitude;
започвам// използвайте някаква услуга, за да намерите "townName", след което зададете резултат от функцията:
доведе. Широта: = 45,54;
доведе. Дължина: = 18,71;
край;
И тук имаме функция, връщаща 2 реални стойности. Добре, той връща 1 запис, но този запис има 2 полета. Обърнете внимание, че можете да имате много сложен запис, който да смесва различни видове, които да бъдат върнати в резултат на функция.
Това е. Следователно, да, функциите на Delphi могат да върнат множество стойности.