2012-06-12 3 views
0

Закрытие представляет собой внешнюю функцию O, которая в своем теле имеет переменную x и внутреннюю функцию F. F должен получить доступ к x. O должен возвращать F, то есть сам F (или его указатель), а не возвращаемое значение F. Таким образом, поскольку F можно вызывать из кода вне O, а F нужно выполнить x, x следует сохранить в области после Вывода.Можем ли мы иметь закрытие без внутренних функций?

В javascript мы можем определять функции внутри функций так, чтобы они были прямолинейными. В C# мы должны использовать анонимные методы или анонимные делегаты для того же поведения, что и внутренние функции.

Сущность замыкания заключается в сохранении значений локальных переменных функции после выхода функции, так что в следующий раз, когда функция вызывается, предыдущие значения уже присутствуют. Вышеупомянутый синтаксис и методы - это способы выполнения замыканий.

В любом случае, на любом языке (кроме языка ассемблера) есть сущность замыканий без использования внутренней функции или делегата. Поле Ofcourse в классах в ООП имеет тот же эффект, но я ищу способы, кроме этого.

+1

Классы - это закрытие бедных людей, закрытие классов бедного человека :) Единственная изменяющаяся деталь - это то, как вы реализуете хранилище резервных копий. – leppie

ответ

0

Закрытие по определению закрывает переменные в лексической области. Было бы совершенно бесполезно, если бы оно не могло быть «внутренним» для чего-то другого с локальными переменными. Так что в значительной степени закрытие должно быть способно находиться внутри некоторой функции.

Однако одна сложность заключается в том, что замыкания на некоторых языках тесно связаны с анонимными функциями. (Анонимные функции обычно должны быть закрытыми, закрытие не должно быть анонимными функциями, но на некоторых языках единственными закрытиями являются анонимные функции.) И синтаксис для анонимных функций может отличаться от синтаксиса для регулярных (именных) функций (особенно на языках с отдельное пространство имен для функций и переменных, именованные функции будут в пространстве имен функций, но анонимными функциями будут данные). И на некоторых из этих языков нет «внутренних» названных функций.

Например, в PHP все именованные функции находятся в глобальной области. Включение определения именованной функции внутри другого (контринтуитивно) определяет внутреннюю функцию в глобальной области видимости (внешний код может видеть ее) при выполнении внешней функции (как если бы она была объявлена ​​во внешней области, но с задержкой). Однако PHP 5.3+ также имеет анонимные функции, которые являются закрытием; люди обычно ссылаются на анонимные функции как на «закрытие», потому что это единственные замыкания на языке.

Другим примером является Ruby. Синтаксис def определяет метод. Определение метода внутри другого метода (контринтуитивно) по-прежнему определяет метод как видимый для других методов. Ruby также имеет анонимные функции, которые являются закрытиями, используя синтаксис lambda, proc или Proc.new, но они синтаксически различны.

0

Я бы не назвал их закрытием, но концепция сохранения локальных переменных находится в VB с локальными переменными Static.

Sub Example() 
    Dim normalVar As Integer 
    Static staticVar As Integer 

    normalVar += 1 
    staticVar += 1 

    Console.WriteLine("{0} {1}", normalVar, staticVar) 
End Sub 

(Это VB.NET, но Static был в VB3 или более ранних версий.) Выход

Это будет

1 1 
1 2 
1 3 

, если назвать три раза.

Смежные вопросы