gpt4 book ai didi

groovy - Groovy 中的函数式样式计数器

转载 作者:行者123 更新时间:2023-12-04 18:08:27 27 4
gpt4 key购买 nike

我对函数式编程概念非常陌生,正在观看 Neil Ford 在 youtube 中的演讲。 .在那里他谈到了一个计数器来演示一段代码而不使用全局状态(在 20:04)。来自 Java 世界,我很难理解这里的概念以及计数器是如何递增的。下面是相关代码

def makeCounter() {
def very_local_variable = 0;
return {very_local_variable += 1}
}

c1 = makeCounter()
c1()
c1()
c1()

c2 = makeCounter()
println "C1 = ${c1()}, C2 = ${c2()}"

他接着说 C1 = 4,C2 = 1 将被打印出来。这是怎么发生的?我确信我在这里缺乏理解可能源于 Groovy 如何工作的概念性失败,或者可能在 Groovy、Scala 等函数式语言中存在一些通用的东西。 方法中的局部变量是否保持其状态,直到再次调用该函数?分配给另一个变量? (谷歌搜索“function counter groovy| scala”一无所获)

最佳答案

我不知道为什么这个问题没有答案,但对于 future 的访问者来说,它可能至少值得一个。

你上面写的是一个简单的例子closure .闭包是一种与语言无关的想法,完全与 Groovy 无关。您一直在使用它们,例如在 JavaScript 中。

闭包本质上是一个函数或对函数的引用以及引用环境。

在您的示例中,每次调用 makeCounter介绍一个新的本地very_local_variable ,很明显我想。您在该函数的第二行中所做的是返回一个不带参数的闭包({ .. } 语法),并返回递增 1 的局部变量。只要该变量存在,闭包就可以访问该变量(它是引用环境)。

每次调用 makeCounter创建一个新的局部变量并返回一个新的闭包,因此它们每个都在自己的局部变量/环境上运行。

实际上,如果您来自 java ,对您来说应该不会那么陌生。您有匿名类,可以访问最终变量,例如

Runnable makeCounter() {
final int[] very_local_variable = {0};
return new Runnable() {
@Override
public void run() {
very_local_variable[0] += 1;
}
};
}


Runnable c1 = makeCounter();

c1.run();
c1.run();
c1.run();

将局部变量声明为数组,返回 Runnable仿函数等等......这一切都来自Java的设计和限制,但本质上它真的很接近你的代码。 Java 8 缩小了差距:
Runnable makeCounter() {
int[] very_local_var = {0};
return () -> { very_local_variable[0] += 1; };
}

关于groovy - Groovy 中的函数式样式计数器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20666934/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com