В чем разница между функциями и замыканиями? [закрытый]

Я читал руководство по программированию swift в iBooks. Может кто-нибудь объяснит мне в чем разница между функцией и закрытие. Это просто, что он не имеет имени и может использоваться в выражениях?

2 ответов


функции, на самом деле, просто называются закрытиями. По крайней мере, концептуально эквивалентны:

let foo = { println("hello") }

func foo()->(){ println("hello") }

это становится немного сложнее в случае использования func чтобы объявить методы, так как есть некоторые интересные кусочки сахара, добавленные относительно автоматической вставки общедоступных именованных параметров и т. д. func myMethod(foo:Int, bar:Int, baz:Int) становится func myMethod(foo:Int, #bar:Int, #baz:Int), например.

но по-прежнему верно, что даже методы - это просто конкретный случай замыканий, и если это верно для замыканий, это справедливо и для функций и методов.


во-первых, начнем с определение закрытия, как найдено в Википедии:

в языках программирования закрытие (также лексическое закрытие или функция закрытие) является функцией или ссылкой на функцию вместе с a referencing environment-таблица, хранящая ссылку на каждый из нелокальные переменные (также называемые свободными переменными или upvalues) этого функция.

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

определение закрытия в Swift встроено в лямбда и блоки на других языках, таких как C# и Ruby.

что касается отличия от функций, от Swift документация:

глобальные и вложенные функции, введенные в функции, на самом деле особые случаи закрытия

таким образом, все функции по существу, замыкания, которые хранят ссылки на переменные в их контексте.

Closure expressions являются удобным способом написания замыканий и обеспечивают более краткий синтаксис.