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

时间:2013-06-12 05:42:27

标签: objective-c closures block

我在Objective-C中编程,我知道一些Scala,Python和Javascript。

虽然我对Obj-C中的块感到满意,但我想知道他们解决了哪些具体问题,我不能使用早期版本的语言。另外 - 是块,闭包,函数文字,命名函数,匿名函数 - 同一个东西?

如果你能回答一些很棒的代码示例。

1 个答案:

答案 0 :(得分: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);
}];

当然,在第二个问题中,无论是谁阅读代码,它都是显而易见的。在第一个中,你必须向上和向下滚动以获得函数的实现(如果有的话!),这样你才能理解收到某些数据时会发生什么。

  

是块,闭包,函数文字,命名函数,匿名函数 - 同一个东西吗?

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

Closuresanonymous functions是一个数学和/或CS理论概念 - 他们认为subroutinesfirst-class values

Blocks是闭包的特定实现,正如Apple在C(以及Objective-C)编程语言的扩展中实现的那样。

Named function expressions是一个JavaScript功能,它结合了闭包和全局函数的优点。