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