为什么仍然称其为“关闭”? 快速的概念外观。

名字叫什么?

如果编程语言带有命名功能,则可以肯定地以某种方式命名了它。 可以肯定的是,语言设计师的命名目的有目的的,因此,如果您能找到一个至关重要的“他们为什么要这样命名?”的问题,那么您可能就更了解该功能或概念了。

为什么要“关闭”?

现在的挑战是:真正找出“为什么?”问题的答案。

Swift是在公开场合开发的,通常它使人们好奇地洞悉诸如命名决策之类的事物。 但是,Swift中的闭包比Swift开源的时间更长。

既然如此,在关于为何将闭包命名为“闭包”的对话中,我真的找不到很多。

闭包语言还存在其他语言,因此也许Swift只是借用了这个名字。 但这并不能帮助我们回答将闭包命名为“闭包”的底线原因。

打开“封盖”的包装(感谢thesaurus.com!)

所以……我开始冒险一词,以帮助阐明“封闭”一词的含义。

知道“闭包是可以包含并在您的代码中使用的自包含功能块”,这是一回事。(Apple Developer Docs)但要认真地讲-为什么不直接将它们称为“函数”?

如果可以的话,让我们打开这个词。 我将“ closure”放入thesaurus.com,我认为在编程语言中最能阐明“ closure”一词的同义词包括:

从这个意义上说,“封闭”似乎传达了将某物保持在…… 封闭状态的想法。

好吧,封闭的内容是什么? 好问题!

简短的答案? 变量

不可避免地,如果仔细研究互联网的含义,就会遇到与上面引用的Apple类似的定义。 在我发现的各种定义中,通常会出现“捕获变量 ”或“结束变量 ”之类的短语。

这些短语似乎总是使水变得浑浊(无论如何对我而言)。 尚不清楚“捕获变量”或“结束变量”是什么意思。 直到我看到同义词,“ plug”,“ seal”,“ cork”。

然后它点击了…

想象力的例子

我希望您在Swift中使用某个功能,并且希望您将其想象为一个空游泳池。 进入您的脑海了吗? 游泳池。 空(暂时)。

在运行时,您的Swift程序会愉快地执行。 然后,在程序中有片刻会调用函数。 它开始执行,突然,水涌入池中。 一打跳水硬币也被扔入水中!

硬币代表函数创建以执行其工作的局部变量和常量。

您的函数一直执行到return关键字,并在函数返回的确切时刻开始排水。在几毫秒内 ,用巨大的力将所有水从池中吸出。

您认为池中的所有硬币会发生什么?

对于此示例,我们只说答案是“他们会费尽心机”。 这将与函数返回时在函数中声明的变量和常量通常发生的情况很好地关联。

每当函数返回时,都会从内存中清除在函数内部创建的所有变量和常量……如果可以的话,请尽一切努力。

Unleeeees…

如果在某个时候池中仍然有水,您能够潜入水中,拿走几枚硬币并将其装瓶怎么办?

如果您可以将它们粘贴在容器中并用软木塞或其他某种密封件 塞住怎么办?

如果可以的话,拔下塞子(即函数返回)后,硬币将在游泳池的洪流中幸存下来 。 这就是我要您从示例中摘取的内容。

闭包是一种机制,它可以跳入池中,挖出它需要的硬币(即变量和常量),并对其自身进行密封 ,以便每当其父函数(池)耗尽时,它和里面的硬币就可以生存

实践中的关闭

当您听到闭包是“可以传递并在您的代码中使用的功能完备的功能块”时,您可能没有意识到它们可以从环境中获取变量,将其打包并密封起来,因此保护这些变量。

事实证明,您创建的每个闭包都内置了此功能。

并不是所有的闭包都需要去捕获变量,但是如果相关的话,Swift中的所有闭包都可以这样做。

就是使闭包成为“闭包”的原因。