繁体   English   中英

Swift 闭包、Java 闭包和 ZA7F5F35426B927411FC9231B56BB382173Z Z04A7DA3C5B04CAD8BZDAEE 表达式有什么区别?

[英]What is the difference between Swift Closures, Java Closures, and Python Lambda expressions?

Swift 闭包和 Python Lambda 表达式有什么区别?

我经常看到网站将 Swift 闭包描述为类似于 Python lambda 表达式的东西。 它们具有相似的目的,甚至Swift 闭包文档指出

“Swift 中的闭包类似于 C 和 Objective-C 中的块以及其他编程语言中的 lambda。”

Python Lambda 表达式

sum = lambda a, b : a + b

Swift 闭合

var sum = { (a: Int, b: Int) -> Int in
    return a + b
}

这两个代码的用途基本相同,我想知道它们在语言方面有何不同。

另一方面,Javascript 闭包似乎用于完全不同的目的。

Javascript 闭合

function greeting() {
    let message = 'Hi';

    function sayHi() {
        console.log(message);
    }

    return sayHi;
}
let hi = greeting();
hi();

据我了解,Swift 闭包类似于 Python lambda,但与 Javascript 闭包完全不同。 Swift 闭包是一流函数的实现,而 Javascript 闭包只允许访问参数列表之外的变量。

我很困惑 Javascript 闭包和 Swift 闭包之间是否存在任何联系,因为它们具有相同的名称。

闭包是一个 function,它的定义方式允许它携带从另一个上下文定义的值,通常是“更高”的 scope 之一。

您在 Java 中给出的示例就是其中之一。 在 Python 中,lambda 表达式不是闭包。 在 Python 中,我们将创建一个类似于您帖子中的 Java 示例的闭包。 这是 Python 闭包的示例:

def greet_boss(name):
    def greet(person):
        if person == name:
             return "Yes sir!"
        return f"Hello {name}"
    return greet

greet_boss包含greet并返回 function。 因此,您可以执行以下操作: greet_boss("Obama")("Biden")并获得“Hello Biden”。 但是如果你做greet_boss("Obama")("Obama")你会得到“是的先生。”。

Swift 闭包也是这样。

在 Python 中,lambda 表达式是匿名 function Lambda 表达式定义了一个可调用对象,其工作方式类似于 function,但它没有名称。 在 Python 中,最好只使用 lambda 表达式作为高阶函数的参数,例如mapfilter以及其他将可调用作为参数的函数。 否则,您可能应该只使用一行def func...

在函数式编程语言中,函数是“第一个 class 公民”。 这意味着它们可以像数据一样传递(整数、字符串、arrays 等)。并非所有语言都以这种方式处理函数。 一些不是严格函数的语言(例如 Python)仍然具有第一个 class 函数。 在上面的示例中,函数由其他函数返回:返回函数是闭包 您也可以将函数作为参数值传递给第一个 class。 例子:

def return_certain_times(list_of_times, time_filter):
    out = []
    for time in list_of_times:
        if time_filter(time):
            out.append(time)
    return out

如果您有一周中的几天列表,您可以执行类似return_certain_time(my_times, lambda x: x == "Saturday')类的操作,这将返回与“Saturday”匹配的所有时间的列表。(这不是您想要的 function 的一个很好的例子,但它很好地说明了这个概念。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM