1

我用 Objective-C 编程,我懂一点 Scala、Python 和 Javascript。

虽然我对 Obj-C 中的块感到满意,但我想知道它们解决了哪些特定问题,而我无法使用该语言的早期版本。还有——块、闭包、函数字面量、命名函数、匿名函数——是一回事吗?

如果您可以回答一些代码示例,那就太好了。

4

1 回答 1

3

首先,为了回答标题中的问题:

为什么我们需要编程语言中的块、函数字面量、闭包?

答案#1:我们没有。没有它们, Brainfuck是图灵完备的。

答案 #2:因为我们很懒,而且闭包方便易用。

他们解决了什么具体问题?

他们没有解决任何具体问题。如果你熟悉 Objective-C,你肯定听说过函数指针,对吧?现在,每次在某处使用块时,可以使用函数指针将这段代码转换为等效的片段。闭包给程序员带来的巨大成就是可读性。与“普通”全局函数不同,闭包(块、lambda 函数等)可以(并且正在)在创建它们的地方使用。考虑以下两段代码(关于 Cocoa 网络 API 发明的两个虚构方法):

void url_callback(void *data, size_t length)
{
    NSLog(@"Received data %p of size %zu", data, length);
}

[connection sendAsyncRequestWithHandlerFPtr:&url_callback];

相对

[connection sendAsyncRequestWithHandlerLambda:^(void *data, size_t length) {
    NSLog(@"Received data %p of size %zu", data, length);
}];

当然,在第二个中,任何阅读代码的人都清楚代码的作用。在第一个中,您必须上下滚动才能到达函数的实现(如果有的话!),这样您就可以了解接收到一些数据时会发生什么。

块、闭包、函数字面量、命名函数、匿名函数——是一回事吗?

不,他们不是。(相当。)

闭包匿名函数是一个数学和/或 CS 理论概念——它们描述了属于一等值的子例程

块是闭包的一种特殊实现,正如 Apple 在 C(以及相应的 Objective-C)编程语言的扩展中实现的那样。

命名函数表达式是一种结合了闭包和全局函数优点的 JavaScript 特性。

于 2013-06-12T05:58:50.610 回答