Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Lua 关于“的一些问题”;“关闭”;在卢阿_Lua_Closures - Fatal编程技术网

Lua 关于“的一些问题”;“关闭”;在卢阿

Lua 关于“的一些问题”;“关闭”;在卢阿,lua,closures,Lua,Closures,这是我的代码,我混淆了返回函数(c1,c2)中的局部变量“count”和内存strack,它们存储在哪里 function make_counter() local count = 0 return function() count = count + 1 return count end end c1 = make_counter() c2 = make_counter() print(c1())--print->1 print(c1())--print-&g

这是我的代码,我混淆了返回函数(c1,c2)中的局部变量“count”和内存strack,它们存储在哪里

function make_counter()
  local count = 0
  return function()
    count = count + 1
    return count
  end
end
c1 = make_counter()
c2 = make_counter()
print(c1())--print->1
print(c1())--print->2
print(c1())--print->3

print(c2())--print->1
print(c2())--print->2

我不太确定您到底在问什么,但我将尝试解释闭包是如何工作的

在Lua中执行此操作时:

function() <some Lua code> end
以下是事实:

tableA = CreateTable()
tableB = CreateTable()
if(tableA == tableB) then
    print("You will never see this")
else
    print("Always printed")
end
尽管
tableA
tableB
都是空表(包含相同的内容),但它们是不同的表。它们可能包含相同的内容,但它们是不同的值

函数也是如此。Lua中的函数通常称为“闭包”,特别是当函数包含内容时。函数根据其使用变量的方式给出内容。如果函数引用的局部变量位于创建该函数的位置的作用域中(请记住:语法
function()end
每次调用时都会创建一个函数),则该函数将包含对该局部变量的引用

但是局部变量超出了范围,而函数的值可能仍然存在(在您的情况下,返回它)。因此,函数的对象闭包必须包含对该局部变量的引用,该局部变量将导致函数继续存在,直到放弃闭包本身


这些值存储在哪里?没关系;只有闭包可以访问它们(尽管有一种方法可以通过C Lua API或通过Lua Debug API)。因此,与表不同,在表中,您可以获取任何您想要的内容,闭包可以真正隐藏数据。

我不太确定您的确切要求,但我将尝试解释闭包是如何工作的

在Lua中执行此操作时:

function() <some Lua code> end
以下是事实:

tableA = CreateTable()
tableB = CreateTable()
if(tableA == tableB) then
    print("You will never see this")
else
    print("Always printed")
end
尽管
tableA
tableB
都是空表(包含相同的内容),但它们是不同的表。它们可能包含相同的内容,但它们是不同的值

函数也是如此。Lua中的函数通常称为“闭包”,特别是当函数包含内容时。函数根据其使用变量的方式给出内容。如果函数引用的局部变量位于创建该函数的位置的作用域中(请记住:语法
function()end
每次调用时都会创建一个函数),则该函数将包含对该局部变量的引用

但是局部变量超出了范围,而函数的值可能仍然存在(在您的情况下,返回它)。因此,函数的对象闭包必须包含对该局部变量的引用,该局部变量将导致函数继续存在,直到放弃闭包本身

这些值存储在哪里?没关系;只有闭包可以访问它们(尽管有一种方法可以通过C Lua API或通过Lua Debug API)。因此,闭包与表不同,在表中,您可以获取任何您想要的内容,闭包可以真正隐藏数据

在带有记忆带的返回功能(c1,c2)中,它们存储在哪里

function make_counter()
  local count = 0
  return function()
    count = count + 1
    return count
  end
end
c1 = make_counter()
c2 = make_counter()
print(c1())--print->1
print(c1())--print->2
print(c1())--print->3

print(c2())--print->1
print(c2())--print->2
它被储存在封套里


c1
不是闭包,它是由
make_counter()
返回的函数。闭包没有在任何地方显式声明。它是由
make_counter()
返回的函数和该函数的“自由变量”的组合。具体见:

闭包通常使用一个特殊的数据结构来实现,该数据结构包含一个指向函数代码的指针,以及创建闭包时函数词汇环境的表示(例如,可用变量集及其值)

在带有记忆带的返回功能(c1,c2)中,它们存储在哪里

function make_counter()
  local count = 0
  return function()
    count = count + 1
    return count
  end
end
c1 = make_counter()
c2 = make_counter()
print(c1())--print->1
print(c1())--print->2
print(c1())--print->3

print(c2())--print->1
print(c2())--print->2
它被储存在封套里


c1
不是闭包,它是由
make_counter()
返回的函数。闭包没有在任何地方显式声明。它是由
make_counter()
返回的函数和该函数的“自由变量”的组合。具体见:

闭包通常使用一个特殊的数据结构来实现,该数据结构包含一个指向函数代码的指针,以及创建闭包时函数词汇环境的表示(例如,可用变量集及其值)


Lua闭包还可以用于实现基于原型的类和对象。闭包类和对象的行为与普通Lua类稍有不同,它们的调用方法也有所不同:

-- closure class definition

StarShip = {}

function StarShip.new(x,y,z)
    self = {}

    local dx, dy, dz
    local curx, cury, curz
    local engine_warpnew

    cur_x = x; cur_y = y; cur_z = z

    function setDest(x,y,z)
        dx = x; dy=y; dz=z;
    end

    function setSpeed(warp)
        engine_warpnew = warp
    end

    function self.warp(x,y,z,speed)
        print("warping to ",x,y,x," at warp ",speed)
        setDest(x,y,z)
        setSpeed(speed)
    end

    function self.currlocation()
        return {x=cur_x, y=cur_y, z=cur_z}
    end

    return self
end

enterprise = StarShip.new(1,3,9)

enterprise.warp(0,0,0,10)

loc = enterprise.currlocation()

print(loc.x, loc.y, loc.z)
生成以下输出:

在扭曲10处扭曲到0 1 3 9

在这里,我们将原型对象“StarShip”定义为一个空表

然后我们用“new”方法为星际飞船创建一个构造函数。它要做的第一件事是创建一个名为self的闭包表,其中包含对象的方法。闭包中的所有方法(定义为“function self.”的方法)都是“closed”或为构造函数可访问的所有值定义的。这就是为什么它被称为闭包。当构造函数完成时,它返回闭包对象“returnself”

有关基于闭包的对象的更多信息,请参见:


Lua闭包也可用于实现基于原型的类和对象。闭包类和对象的行为与普通Lua类稍有不同,它们的调用方法也有所不同:

-- closure class definition

StarShip = {}

function StarShip.new(x,y,z)
    self = {}

    local dx, dy, dz
    local curx, cury, curz
    local engine_warpnew

    cur_x = x; cur_y = y; cur_z = z

    function setDest(x,y,z)
        dx = x; dy=y; dz=z;
    end

    function setSpeed(warp)
        engine_warpnew = warp
    end

    function self.warp(x,y,z,speed)
        print("warping to ",x,y,x," at warp ",speed)
        setDest(x,y,z)
        setSpeed(speed)
    end

    function self.currlocation()
        return {x=cur_x, y=cur_y, z=cur_z}
    end

    return self
end

enterprise = StarShip.new(1,3,9)

enterprise.warp(0,0,0,10)

loc = enterprise.currlocation()

print(loc.x, loc.y, loc.z)
生成以下输出:

在扭曲10处扭曲到0 1 3 9

在这里,我们将原型对象“StarShip”定义为一个空表

然后我们用“new”方法为星际飞船创建一个构造函数。它要做的第一件事是创建一个名为self的闭包表,其中包含对象的方法。闭包中的所有方法(定义为“function self.”的方法)都是“closed”或为构造函数可访问的所有值定义的。这就是为什么它被称为闭包。当构造函数完成时,它返回闭包对象“returnse”