C ++ 0x - лямбда-выражение выглядит так же, как анонимный внутренний класс Java? - PullRequest
6 голосов
/ 02 июля 2010

Верна ли моя интерпретация лямбда-выражения в контексте c ++ и Java?

Ответы [ 3 ]

5 голосов
/ 02 июля 2010

Они не совсем такие же. Оба создают безымянные классы, но их сходство на этом заканчивается.

В C ++ вы создаете замыкание, перехватывающее ваши локальные переменные, необязательно по ссылке. В Java вы просто получаете снимок текущих значений локальной переменной (и эти переменные должны быть «окончательными»).

Цель анонимных внутренних классов - расширить другой класс или реализовать другой интерфейс ad-hoc. По этой причине анонимные внутренние классы могут в некоторой степени имитировать работу лямбда-выражений, например, путем реализации интерфейса Runnable. Лямбда-выражения специально предназначены для вызова и, возможно, изменения локальных переменных в их среде.

5 голосов
/ 02 июля 2010

Анонимный внутренний класс Java может ссылаться на final данные во включающем методе и на все данные (включая изменяемые) во включающем классе.Таким образом, методы в анонимных классах не могут изменять значения переменных во включающем методе, но они могут изменять значения членов во включающем классе.

Лямбда C ++ может ссылаться на все данные (включаяизменяемый) во включающей функции, и если он вложен в функцию-член, он может сделать то же самое для данных включающего класса.Точная степень зависимости от вмещающей области (областей) объявляется программистом, поэтому она является явной, а не неявной.

Это делает их весьма похожими, но функция Java по-разному обрабатывает локальные переменные / параметры в методах,по принципу, что они не должны быть изменяемыми извне метода, особенно в языке, который традиционно использует многопоточность так случайно.

Сравните с лямбдами C #, которые не имеют ограничений и все зависимости являются неявными.Это делает их, безусловно, наименее подробными из этих функций (также им помогают лучшие выводы типа).Но с другой стороны, они лишают законной силы все простые правила о потоке, то есть уже не обязательно верно, что локальные переменные находятся «в стеке потока» и, следовательно, никогда не требуют блокировки перед доступом.

2 голосов
/ 02 июля 2010

C ++ 0x лямбда-выражения безымянные методы , анонимные классы Javas безымянные классы . Таким образом, они разделяют не имея имени, но концепции разные.

Начиная с самого очевидного факта, что лямбда-функции (могут) возвращать значение, а анонимные классы могут использоваться для создания экземпляров (объектов).

BTW - Википедия упоминает, что для C ++ 0x предлагаются только лямбда функции .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...