高阶函数函数体内的局部变量

来源:6-1 高阶函数

_Jihan

2020-04-10

图片描述
value现在通过Fibonacci赋值为函数类型,即为红框内的函数体。
我现在有两个疑问就是:
1.value中的函数first以及second是怎么关联到Fibonacci中的局部变量first以及second?
2.因为在java中局部变量随着函数体执行完毕会释放,在第一个问题基础上,那么这里怎么判断first是否执行完毕呢?

写回答

2回答

bennyhuo

2020-04-10

kotlin当中函数跟普通类一样,有对象,所以问题1实际上就是lambda表达式直接访问外部作用域的变量,你可以理解成访问外部类的成员。

这里因为有函数返回,因此外部函数不会结束,这个java是做不到的。

1
1
_Jihan
非常感谢!
2020-04-10
共1条回复

慕移动4574462

2023-01-27

public static final Function0 fibonacci() {
   final Ref.LongRef first = new Ref.LongRef();
   first.element = 0L;
   final Ref.LongRef second = new Ref.LongRef();
   second.element = 1L;
   return (Function0)(new Function0() {
      // $FF: synthetic method
      // $FF: bridge method
      public Object invoke() {
         return this.invoke();
      }

      public final long invoke() {
         long next = first.element + second.element;
         long current = first.element;
         first.element = second.element;
         second.element = next;
         return current;
      }
   });
}

show kotlin bytecode 之后反编译的结果, 看着 first second 是基本类型 Long 局部变量, 其实被编译期处理成了引用类型 Ref 存储在堆上, 返回了 Function 对象仍然在引用, 所以不会回收且一直能保存更新值.

0
0

学会Kotlin 突破开发语言瓶颈

如果有一门语言可以取代Java,那么它一定是Kotlin。

1760 学习 · 481 问题

查看课程