Затваряне (информатика)
From Wikipedia, the free encyclopedia
Remove ads
Затваряне (на английски: closure) в програмирането е функция, която запазва (затваря) областта на видимост, в която е дефинирана, поне докато съществува референция към нея.
За информацията в тази статия или раздел не са посочени източници. Въпросната информация може да е непълна, неточна или изцяло невярна. Имайте предвид, че това може да стане причина за изтриването на цялата статия или раздел. |
В повечето програмни езици обектите се унищожават при излизането от областта на видимост, в която са дефинирани. Използването на затваряне гарантира, че обектите, дефинирани в неговата област на видимост, няма да бъдат унищожени, докато то е използвано или реферирано.
Remove ads
Пример
В долните примери функция, дефинираща област на видимост, връща затваряне, което използва локална променлива а във функцията. Както е видимо, локалната променлива продължава да съществува, въпреки че функцията е завършила. В повечето езици, които поддържат области на видимост, а ще бъде унищожена при изход от функцията.
Псевдокод
функция Ф()
а = 5;
з = затваряне
а = а + 1;
върни а;
край;
върни з;
край;
х = ф();
х(); // -> 6
х(); // -> 7
Ruby
def f
a = 5
Proc.new {
a += 1
a
}
end
x = f
x.call # -> 6
x.call # -> 7
Remove ads
Привидни затваряния
В някои езици се поддържат привидни затваряния. Те не запазват областта на видимост, в която са дефнирани, но могат да се използват за удобство при фукции, взимащи функция за параметър. В долните примери затварянията никога не са използвани извън областта на видимост, в която са дефинирани, и следователно работят. При опит да бъдат използвани извън нея би се получило недефинирано поведение.
Пример 1
Това е валиден код за С++, поддържан от GCC 3.7. Функция, която връща сбор на елементите на вектор:
int sum(const vector<int>& values)
{
int s = 0;
void closure(int n)
{
s += n;
}
foreach(values.begin(), values.end(), closure);
return s;
}
Пример 2
Това отново е пример от С++. Този синтаксис е предложен за поддръжката на затваряния в С++ в стандарта С++09. Тук се комбинра затваряне и анонимна функция:
int sum(const vector<int>& values)
{
int s=0;
foreach(values.begin(), values.end(), void <>(int n){ s += n; });
return s;
}
Remove ads
Вижте също
Wikiwand - on
Seamless Wikipedia browsing. On steroids.
Remove ads