Lua中命名函数与匿名函数有何本质区别?
- 内容介绍
- 文章标签
- 相关推荐
本文共计673个文字,预计阅读时间需要3分钟。
这些`myFuncs`之间主要的区别在于它们的定义方式和内部变量`someVariable`的初始化。
代码片段1:luafunction wrapper() local someVariable=0 function myFunc(n) if n <0 then return end return myFunc(n - 1) end return myFuncend在这段代码中,`someVariable`在`wrapper`函数中初始化为0,并在整个`wrapper`函数的调用期间保持不变。`myFunc`是局部定义的函数,当`wrapper`被调用时,会创建一个新的`myFunc`函数实例。
代码片段2:luafunction wrapper() local someVariable=0 local myFunc=function(n) if n <0 then return end return myFunc(n - 1) end return myFuncend在这段代码中,`someVariable`同样是初始化为0,并且只在`wrapper`函数的局部作用域中有效。`myFunc`也是一个局部定义的函数,其定义和执行与代码片段1相同。
两段代码的主要区别在于`myFunc`的调用和作用域管理。在代码片段1中,`myFunc`直接被定义并返回,这可能会导致在每次调用`wrapper`时都创建一个新的`myFunc`实例。而在代码片段2中,`myFunc`通过赋值给`local myFunc`的方式被定义,并在`wrapper`函数的内部调用,这有助于在连续调用`wrapper`时复用同一个`myFunc`函数实例。
这些myFuncs之间有什么区别?代码1
function wrapper() local someVariable = 0; function myFunc(n) if n > 0 then return myFunc(n-1) end end return myFunc; end
代码2
function wrapper() local someVariable = 0; local myFunc = function(n) if n > 0 then return myFunc(n-1) end end return myFunc; end
代码3
function wrapper() local someVariable = 0; local myFunc; myFunc = function(n) if n > 0 then return myFunc(n-1) end end; return myFunc; end
因为当我在myFunc本身中引用函数名myFunc时.他们的行为不一样. (例如,upvalue someVariable ……有问题:-S)
[编辑:我误读了你的代码#2.]代码#1将myFunc的全局值设置为函数.因此,每次调用包装器时,您都会将此全局设置为新值.此外,对myFunc调用的任何引用都将是对此全局(可修改),而不是对本地(对于闭包的升值).
代码#2设置局部变量myFunc.但是,由于Lua的规则,该局部变量仅在定义它的语句完成后才进入范围.这允许你做这样的事情:
local x = x or 5
表达式中的x是先前声明的本地或全局.在评估x或5表达式之前,新x不会进入范围.
您的功能定义也是如此.因此,对myFunc的任何引用都将是一个全局变量,而不是本地变量.
代码#3创建一个局部变量myFunc.然后它将该变量设置为一个函数.因为函数是在局部变量进入范围之后创建的,所以函数中对myFunc的引用将引用局部变量,而不是全局变量.
注意,局部函数X相当于局部X; X =功能….不是本地X =功能….
本文共计673个文字,预计阅读时间需要3分钟。
这些`myFuncs`之间主要的区别在于它们的定义方式和内部变量`someVariable`的初始化。
代码片段1:luafunction wrapper() local someVariable=0 function myFunc(n) if n <0 then return end return myFunc(n - 1) end return myFuncend在这段代码中,`someVariable`在`wrapper`函数中初始化为0,并在整个`wrapper`函数的调用期间保持不变。`myFunc`是局部定义的函数,当`wrapper`被调用时,会创建一个新的`myFunc`函数实例。
代码片段2:luafunction wrapper() local someVariable=0 local myFunc=function(n) if n <0 then return end return myFunc(n - 1) end return myFuncend在这段代码中,`someVariable`同样是初始化为0,并且只在`wrapper`函数的局部作用域中有效。`myFunc`也是一个局部定义的函数,其定义和执行与代码片段1相同。
两段代码的主要区别在于`myFunc`的调用和作用域管理。在代码片段1中,`myFunc`直接被定义并返回,这可能会导致在每次调用`wrapper`时都创建一个新的`myFunc`实例。而在代码片段2中,`myFunc`通过赋值给`local myFunc`的方式被定义,并在`wrapper`函数的内部调用,这有助于在连续调用`wrapper`时复用同一个`myFunc`函数实例。
这些myFuncs之间有什么区别?代码1
function wrapper() local someVariable = 0; function myFunc(n) if n > 0 then return myFunc(n-1) end end return myFunc; end
代码2
function wrapper() local someVariable = 0; local myFunc = function(n) if n > 0 then return myFunc(n-1) end end return myFunc; end
代码3
function wrapper() local someVariable = 0; local myFunc; myFunc = function(n) if n > 0 then return myFunc(n-1) end end; return myFunc; end
因为当我在myFunc本身中引用函数名myFunc时.他们的行为不一样. (例如,upvalue someVariable ……有问题:-S)
[编辑:我误读了你的代码#2.]代码#1将myFunc的全局值设置为函数.因此,每次调用包装器时,您都会将此全局设置为新值.此外,对myFunc调用的任何引用都将是对此全局(可修改),而不是对本地(对于闭包的升值).
代码#2设置局部变量myFunc.但是,由于Lua的规则,该局部变量仅在定义它的语句完成后才进入范围.这允许你做这样的事情:
local x = x or 5
表达式中的x是先前声明的本地或全局.在评估x或5表达式之前,新x不会进入范围.
您的功能定义也是如此.因此,对myFunc的任何引用都将是一个全局变量,而不是本地变量.
代码#3创建一个局部变量myFunc.然后它将该变量设置为一个函数.因为函数是在局部变量进入范围之后创建的,所以函数中对myFunc的引用将引用局部变量,而不是全局变量.
注意,局部函数X相当于局部X; X =功能….不是本地X =功能….

