加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Groovy中的功能样式计数器

发布时间:2020-12-14 16:25:15 所属栏目:大数据 来源:网络整理
导读:我对函数式编程概念非常陌生,并且正在观看Neil Ford在 youtube年的演示.在那里,他谈到了一个计数器来展示一段代码而不使用全局状态(在20:04).来自Java世界,我很难理解这里的概念以及计数器如何递增.以下是相关代码 def makeCounter() { def very_local_varia
我对函数式编程概念非常陌生,并且正在观看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等函数式语言中存在一些通用性.方法中的局部变量是否保持其状态,直到再次调用该函数为止分配给另一个变量? (谷歌搜索与“功能计数器groovy | scala”没有带来任何结果)

解决方法

我不知道为什么这个问题没有答案,但它可能至少应该为未来的访问者提供一个答案.

你上面写的是一个简单的closure例子.闭包是一个与语言无关的想法,根本不依赖于Groovy.你总是使用它们,例如在JavaScript中.

闭包本质上是函数或引用环境的函数或引用.

在您的示例中,每次调用makeCounter都会引入一个新的本地very_local_variable,我认为很明显.你在该函数的第二行中所做的是返回一个不带参数的闭包({..}语法)并返回增加1的局部变量.闭包可以访问该变量,因为它存在(它的一部分)引用环境).

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

实际上,如果你来自爪哇岛,那对你来说应该不是那么新鲜.您有匿名类,可以访问最终变量,例如

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; };
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读