Замыкание (англ. closure) в программировании — процедура или функция, в теле которой присутствуют ссылки на переменные, объявленные вне тела этой функции и не в качестве её параметров (а в окружающем коде).
Должно ли оно обязательно быть лямбда выражением, то анонимной функцией (методом), вложенной в другую? А если вот так:
class MyClass{
int var1;
void method1(){
// работаем с var1
}
}
Здравствуйте, Щъмых, Вы писали:
Щ>Замыкание (англ. closure) в программировании — процедура или функция, в теле которой присутствуют ссылки на переменные, объявленные вне тела этой функции и не в качестве её параметров (а в окружающем коде).
Щ>Должно ли оно обязательно быть лямбда выражением, то анонимной функцией (методом), вложенной в другую? А если вот так:
Щ>
Щ>class MyClass{
Щ> int var1;
Щ> void method1(){
Щ> // работаем с var1
Щ> }
Щ>}
Щ>
Щ>Это замыкание?
Это использование переменных класса в функции. И ничего больше.
А иначе весь гнилой код — одно сплошное замыкание.
Здравствуйте, Щъмых, Вы писали:
Щ>Замыкание (англ. closure) в программировании — процедура или функция, в теле которой присутствуют ссылки на переменные, объявленные вне тела этой функции и не в качестве её параметров (а в окружающем коде). Щ>Должно ли оно обязательно быть лямбда выражением, то анонимной функцией (методом), вложенной в другую? А если вот так:
Здравствуйте, Щъмых, Вы писали:
Щ>Замыкание (англ. closure) в программировании — процедура или функция, в теле которой присутствуют ссылки на переменные, объявленные вне тела этой функции и не в качестве её параметров (а в окружающем коде).
Щ>Должно ли оно обязательно быть лямбда выражением, то анонимной функцией (методом), вложенной в другую?
Что-то много про это замыкание разговоров с ссылками на определение.
"Замыкание" это "фиксирование" свободных переменных функцией при ее создании, т.н. захват (замыкание) функцией своего "лексического окружения". Лексическое окружение (lexical scope) — это набор доступных лексических переменных. У каждой созданной функции есть свое (возможно пустое) захваченное "лексическое окружение".
Благодаря такой возможности можно создавать функции с одним кодом, но с разным поведением.
Здесь в качестве результата выполнения функции gen-greeting будет анонимная функция
(fn [name]
(print greeting ", " name)
Для нее переменная greeting является свободной переменной и при создании будет "захвачено" в лексическое окружение. Вот этот процесс и называется "замыканием".
Например, создадим две разных функций приветствия:
Здравствуйте, BlackEric, Вы писали:
BE>Здравствуйте, Щъмых, Вы писали:
Щ>>Замыкание (англ. closure) в программировании — процедура или функция, в теле которой присутствуют ссылки на переменные, объявленные вне тела этой функции и не в качестве её параметров (а в окружающем коде).
Щ>>Должно ли оно обязательно быть лямбда выражением, то анонимной функцией (методом), вложенной в другую? А если вот так:
Щ>>
Щ>>class MyClass{
Щ>> int var1;
Щ>> void method1(){
Щ>> // работаем с var1
Щ>> }
Щ>>}
Щ>>
Щ>>Это замыкание? BE>Это использование переменных класса в функции. И ничего больше. BE>А иначе весь гнилой код — одно сплошное замыкание.
Согласно определению, ты неправ.
Здравствуйте, Курилка, Вы писали:
К>Здравствуйте, Щъмых, Вы писали:
Щ>>Замыкание (англ. closure) в программировании — процедура или функция, в теле которой присутствуют ссылки на переменные, объявленные вне тела этой функции и не в качестве её параметров (а в окружающем коде). Щ>>Должно ли оно обязательно быть лямбда выражением, то анонимной функцией (методом), вложенной в другую? А если вот так:
К>[cut]
Щ>>Это замыкание?
К>По этому поводу есть выражение: К>
Здравствуйте, MOByte, Вы писали:
MOB>Здравствуйте, Щъмых, Вы писали:
Щ>>Замыкание (англ. closure) в программировании — процедура или функция, в теле которой присутствуют ссылки на переменные, объявленные вне тела этой функции и не в качестве её параметров (а в окружающем коде).
Щ>>Должно ли оно обязательно быть лямбда выражением, то анонимной функцией (методом), вложенной в другую?
MOB>Что-то много про это замыкание разговоров с ссылками на определение.
Я знаю, что такое замыкание. Я хочу понять, вяжется ли мой пример с определением, которое которое дано выше и если нет, то почему.
Здравствуйте, Щъмых, Вы писали:
Щ>Здравствуйте, Курилка, Вы писали: К>>Например, тут Щ>Объясни.
По ссылке достаточно разжёвано. Речь о том, что и объекты и замыкания решают схожую задачу немного отличающимся способом (к примеру в объекте контекст виден более-менее явно, тогда как контекст замыкания можно понять лишь сопоставив его код и доступные переменные)
Здравствуйте, Щъмых, Вы писали:
Щ>Замыкание (англ. closure) в программировании — процедура или функция, в теле которой присутствуют ссылки на переменные, объявленные вне тела этой функции и не в качестве её параметров (а в окружающем коде).
Щ>Должно ли оно обязательно быть лямбда выражением, то анонимной функцией (методом), вложенной в другую? А если вот так:
Щ>
Щ>class MyClass{
Щ> int var1;
Щ> void method1(){
Щ> // работаем с var1
Щ> }
Щ>}
Щ>
Щ>Это замыкание?
Нет, это не замыкание. var1 как была так и остаётся полем класса. А при замыкании, например, локальная переменная метода замыкается во вложенной функции, и продолжает существовать, даже когда произошёл выход из метода (из области видимости этой переменной).
Здравствуйте, Щъмых, Вы писали:
Щ>Я знаю, что такое замыкание. Я хочу понять, вяжется ли мой пример с определением, которое которое дано выше и если нет, то почему.
Нет, не знаешь. Я как раз для этого и привел подробный ответ, чтобы ты понял.
В твоем примере нет замыкания, т.е. нет создания функции с захватом свободных переменных.
По определению, если считать методы функциями, а поля переменными.
Ну если по сути, то не создаются ссылки в контексте захвата, нет свойственного замыканиям поведения при исполнении — нет продления времени жизни переменных.
Здравствуйте, koodeer, Вы писали:
K>Здравствуйте, Щъмых, Вы писали:
Щ>>Замыкание (англ. closure) в программировании — процедура или функция, в теле которой присутствуют ссылки на переменные, объявленные вне тела этой функции и не в качестве её параметров (а в окружающем коде).
Щ>>Должно ли оно обязательно быть лямбда выражением, то анонимной функцией (методом), вложенной в другую? А если вот так:
Щ>>
Щ>>class MyClass{
Щ>> int var1;
Щ>> void method1(){
Щ>> // работаем с var1
Щ>> }
Щ>>}
Щ>>
Щ>>Это замыкание?
K>Нет, это не замыкание. var1 как была так и остаётся полем класса. А при замыкании, например, локальная переменная метода замыкается во вложенной функции, и продолжает существовать,
Тогда определение не совсем верное? Тогда есть должна обязательно быть вложенная (анонимная) функция?
>>даже когда произошёл выход из метода (из области видимости этой переменной).
Какого именно метода: вложенного или внешнего?
Здравствуйте, MOByte, Вы писали:
MOB>Здравствуйте, Щъмых, Вы писали:
Щ>>Я знаю, что такое замыкание. Я хочу понять, вяжется ли мой пример с определением, которое которое дано выше и если нет, то почему.
MOB>Нет, не знаешь. Я как раз для этого и привел подробный ответ, чтобы ты понял.
MOB>В твоем примере нет замыкания, т.е. нет создания функции с захватом свободных переменных.
Я не говорил, что оно там есть. Там спросил, есть ли оно там согласно определению?
Здравствуйте, Щъмых, Вы писали:
Щ>Здравствуйте, MOByte, Вы писали:
MOB>>Здравствуйте, Щъмых, Вы писали:
Щ>>>Я знаю, что такое замыкание. Я хочу понять, вяжется ли мой пример с определением, которое которое дано выше и если нет, то почему.
MOB>>Нет, не знаешь. Я как раз для этого и привел подробный ответ, чтобы ты понял.
MOB>>В твоем примере нет замыкания, т.е. нет создания функции с захватом свободных переменных.
Щ>Я не говорил, что оно там есть. Там спросил, есть ли оно там согласно определению?
Согласно вашему определению, да.
Но вопрос полноты этого определения очень интересен. Потому, что по нему получается, что любая функция, использующая глобальную переменную, является замыканием, а это не так.
Здравствуйте, BlackEric, Вы писали:
BE>Здравствуйте, Щъмых, Вы писали:
Щ>>Здравствуйте, MOByte, Вы писали:
MOB>>>Здравствуйте, Щъмых, Вы писали:
Щ>>>>Я знаю, что такое замыкание. Я хочу понять, вяжется ли мой пример с определением, которое которое дано выше и если нет, то почему.
MOB>>>Нет, не знаешь. Я как раз для этого и привел подробный ответ, чтобы ты понял.
MOB>>>В твоем примере нет замыкания, т.е. нет создания функции с захватом свободных переменных.
Щ>>Я не говорил, что оно там есть. Там спросил, есть ли оно там согласно определению?
BE>Согласно вашему определению, да. BE>Но вопрос полноты этого определения очень интересен. Потому, что по нему получается, что любая функция, использующая глобальную переменную, является замыканием, а это не так.
Это из википедии.
Здравствуйте, grosborn, Вы писали:
G>По определению, если считать методы функциями, а поля переменными. G>Ну если по сути, то не создаются ссылки в контексте захвата, нет свойственного замыканиям поведения при исполнении — нет продления времени жизни переменных.
Есть ссылка, называется this. Передается с каждым вызовом метода ровно так же, как при вызове замыкания передается ссылка на его захваченные переменные. И со временем жизни все ок — "захваченные" переменные живут столько же, сколько и функция (пока жив объект т.е.).
> G>По определению, если считать методы функциями, а поля переменными. > G>Ну если по сути, то не создаются ссылки в контексте захвата, нет свойственного замыканиям поведения при исполнении — нет продления времени жизни переменных. > > Есть ссылка, называется this. Передается с каждым вызовом метода ровно так же, как при вызове замыкания передается ссылка на его захваченные переменные. И со временем жизни все ок — "захваченные" переменные живут столько же, сколько и функция (пока жив объект т.е.).
Глупость какая-то.
Неявная передача ссылки на объект при вызове метода на время жизни объекта и его полей никак не влияет.
Ссылка "this" которая не ссылка, а ключевое слово, передает ровно НЕ так же, как ссылка на объект замыкания.
Здравствуйте, grosborn, Вы писали:
G>Неявная передача ссылки на объект при вызове метода на время жизни объекта и его полей никак не влияет.
Я и не говорил такого. Я говорю, что у метода и данных одно время жизни, ровно как и в случае с замыканием.
G>Ссылка "this" которая не ссылка, а ключевое слово, передает ровно НЕ так же, как ссылка на объект замыкания.
В чем же разница? В обоих случаях при вызове помимо параметров передается одна неявная ссылка — на данные, по сути.
Здравствуйте, grosborn, Вы писали:
G>Глупость какая-то. G>Неявная передача ссылки на объект при вызове метода на время жизни объекта и его полей никак не влияет. G>Ссылка "this" которая не ссылка, а ключевое слово, передает ровно НЕ так же, как ссылка на объект замыкания.
Исключительно зависит от конкретной той или иной реализации языка. Т.е. созданное замыкание вполне может стать объектом, а функция которая использует замыкаение, может стать классом хранящим значения перемнных попавших в замыкание. Но даже если не брать всё это — посмотрине на javascript более пристально — this, конечно же ключевое слово, но передаётся этот this очень даже явно.