lua upvalue

内嵌函数可以访问外包函数的局部变量,而这些局部变量则称为该内嵌函数的外部局部变量(或者upvalue)

 1 function A(n)
 2   
 3   function A_1() --n就是这个内嵌函数的upvalue
 4     print(n) 
 5   end
 6   
 7   return A_1
 8 end
 9 
10 local fnA = A(1)
11 fnA()

 

函数在内嵌函数之后操作局部变量:

 1 function A(n)
 2 
 3   function A_1()
 4     print(n)
 5   end
 6 
 7   n = n + 1
 8   return A_1
 9 end
10 
11 local fnA_1, fnA_2 = A(1)
12 fnA_1() --打印: 2

 

多个内嵌函数操作同一个upvalue

 1 function A(n)
 2 
 3   function A_1()
 4     print(n)
 5   end
 6 
 7   function A_2()
 8     n = n + 1
 9   end
10 
11   n = n + 1
12   return A_1, A_2
13 end
14 
15 local fnA_1, fnA_2 = A(1)
16 fnA_1() --打印: 2
17 fnA_2()
18 fnA_1() --打印: 3

 

 多层内嵌函数:

 1 function A(n)
 2 
 3   function A_1()
 4 
 5     function A_1_1()
 6       print(n)
 7     end
 8 
 9     function A_1_2()
10       n = n + 1
11     end
12 
13     return A_1_1, A_1_2
14   end
15 
16   return A_1
17 end
18 
19 local fnA_1 = A(1)
20 local aFnA_1_1, aFnA_1_2 = fnA_1()
21 aFnA_1_1() --打印 1
22 
23 aFnA_1_2()
24 aFnA_1_1() --打印 2
25 
26 local bFnA_1_1, bFnA_1_2 = fnA_1()
27 bFnA_1_1() --打印 2
28 
29 bFnA_1_2()
30 bFnA_1_1() --打印 3

 

简单一点的理解,就类似java的内部匿名类那样,遇到内嵌函数访问外部函数的变量,就会创建一个匿名内部类对象,然后内嵌函数访问的都是这个对象的成员

 1 function A(n)
 2   local anonymous_obj = { n = n }
 3   function A_1()
 4 
 5     function A_1_1()
 6       print(anonymous_obj.n)
 7     end
 8 
 9     function A_1_2()
10       anonymous_obj.n = anonymous_obj.n + 1
11     end
12 
13     return A_1_1, A_1_2
14   end
15 
16   return A_1
17 end

 

参考:

Lua的upvalue和闭包_陈嘉怡的专栏-CSDN博客_lua upvalue

 

posted @ 2021-12-17 22:05  yanghui01  阅读(210)  评论(0编辑  收藏  举报