Обсуждение:Замыкание (программирование)

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску

Про примеры[править код]

Заголовок темы этого обсуждения был добавлен участником Nashev.

NB. Перенёс все примеры кроме одного (наиболее «классического») в Викиучебник, где им и место, чтобы здесь не разводить свалку. РоманСузи 16:52, 8 января 2015 (UTC)[ответить]

А что в этом хорошего[править код]

А что в этом хорошего, почему это круто и зачем это надо ? Как это правильно использовать? Nbr 12:42, 3 декабря 2006 (UTC)[ответить]

Пример. Есть функция-итератор, которая, например, обходит дерево и делает над каждой веткой заданную операцию. Эта операция задается путем передачи ее в качестве одного из параметров итератора. (Например, в C# это делается через делегат, в C++ - указатель на функцию и т.д.) Мы хотим, чтобы она поработала (обошла дерево) с нашей операцией из одной-двух строчек. Без замыкания пришлось бы эту операцию описывать где-то в другом месте как обычную функцию, называть её именем и передавать это имя в параметрах итератора. А с замыканием можно наши две строчки написать прямо в месте вызова итератора, что есть гораздо логичнее и читабельнее. --М. Ю. (yms) 14:07, 3 декабря 2006 (UTC)[ответить]
Похоже, М. Ю. (yms) описал не преимущества замыканий, а преимущества анонимных функций перед неанонимными. А поддержка языком программирования замыканий просто позволяет обращаться к внешним переменным из функции, передаваемой как объект (когда это нужно). --Bosik GN (обс.) 17:00, 21 февраля 2018 (UTC)[ответить]
Хаха, получил привет из 2006 года. Конечно, тот ответ был весьма невнятным, в нем не хватало главного, но замыкание используется именно для функции, определяемой внутри другой функции. --М. Ю. (yms) (обс.) 17:10, 21 февраля 2018 (UTC)[ответить]

В Java так же реализовано замыкание классов :)

Про замыкание функций - зачем акцентировать внимание на то, что метод из анонимного класса имеет доступ к переменным с модификатором final? Или он имеет доступ только к этим переменным?

Да --212.92.145.1 10:12, 4 ноября 2007 (UTC)[ответить]

Не научный стиль[править код]

Авторам статьи к изучению Википедия:Правила и указания#Язык и стиль 81.9.62.62 21:08, 12 марта 2009 (UTC)[ответить]

Торагой, ну исправили бы! А то Вы только скромно указали нам наше место. 217.77.223.140 22:11, 11 октября 2009 (UTC)[ответить]
Как вы представляете исправление тех частей статьи, в которых человек не разбирается? (языки программирования, отличные от тех, которые он знает). Логично, чтобы ненаучный стиль исправили те, кто писал эту статью или же другие знающие люди. --Irker 09:53, 24 октября 2009 (UTC)[ответить]

Ещё о Java[править код]

1. В приведённом сэмпл-коде есть комментарий:

// Имеет доступ к приватным членам содержащего класса:

Создаётся впечатление, что к остальным полям класса-контейнера нет доступа.
И, у класса в Java - члены или поля? Желательно стандартизовать терминологию, хотя бы в рамках этой статьи.

2. Для анонимного класса Thread реализован метод run(), а вызывается - метод start(). Arcadius 11:29, 8 мая 2010 (UTC)[ответить]

Все правильно. Используется шаблонный метод. Метод start() уже определен для класса Thread и он вызывает метод run(), который пользователь обязан определить сам. Об этом не стоит вспоминать здесь -это только будет мешать пониманию самой статьи. Кому интересно - разберется сам. Msangel 01:25, 27 декабря 2010 (UTC)[ответить]

Замыкания будут поддерживаться в новом стандарте C++. Пока утверждён только черновик спецификации, так что синтаксис и требования в окончательной редакции стандарта могут измениться. Стоит ли написать об этом и привести работающие в GCC/MSVS примеры для C++ 0x? cpp 20:08, 16 января 2011 (UTC)[ответить]

Существующий пример не является замыканием. К тому же C++11 поддерживает замыкания довольно ограниченно. Внёс в статью. 85.141.173.75 11:01, 27 июня 2012 (UTC)[ответить]

C++ замыкание с использованием перегрузки оператора: "()"[править код]

struct Inc
{
  Inc(int dx = 1){this->dx = dx;}
  int operator()(int x){return x + dx;}
private:
  int dx;
};

int main(int argc, char* argv[])
{
  Inc inc, inc5(5);

  cout << inc(4) << endl << inc5(3); // результат: 5 8 
  cin.get();
  return 0;
}

Чем не замыкание?

add(1)(4)(8)(8)[править код]

const res = add(1)(4)(8)(8);

Почему были выбраны именно эти константы? Обязательно ли их использование в примерах? Похоже, что их использовали в других областях и следует придумать другую, менее частную иллюстрацию замыканий. https://en.wikipedia.org/wiki/Fourteen_Words

109.173.10.234 08:42, 19 ноября 2018 (UTC)[ответить]