我的Lua出了什么问题?

我的第一次尝试使用lua,但它并没有工作,它说我试图调用全局变量exiter(一个空值)。我只是进行一个简单的程序来尝试让函数工作。

print("hello world")
io.read()
y = 0

while y < 10 do
    local x = ""
    print("hello world")
    x = io.read()
    if x == "y" then
    y = exiter(1)
    print(y)
    end
end

function exiter(param)
    local q = 0
    print ("hello again")
    q = param * 10
    return q;
end
点赞
用户258523
用户258523

功能定义发生在运行它们的代码时。只有在 while 循环中调用 exiter 函数之后才会创建它。请反转循环和函数定义的顺序。

2014-08-08 15:51:37
用户1190388
用户1190388

Lua 程序从上往下、逐语句执行。因此,当你进入 while 循环时,函数 exiter 还不存在。在进入循环之前要先定义它:

function exiter(param)
    local q = 0
    print ("hello again")
    q = param * 10
    return q;
end

while y < 10 do
    local x = ""
    print("hello world")
    x = io.read()
    if x == "y" then
        y = exiter(1)
        print(y)
    end
end
2014-08-08 15:52:57
用户3204551
用户3204551
函数 `exiter(param)` 是创建闭包并将其分配给 `exiter` 的简单语法糖,它可以是:

- 在同一或包含作用域中之前定义的本地变量,
- 或者是全局变量(也称为环境表`__ENV`的元素)。

exiter = function(param) -- ... end


在执行赋值之前,该变量具有其先前的值,如果尚未指定,则为空。

类似于 `local function`:

local function exiter(param) -- ... end


等价于_首先_定义一个局部变量,然后再像没有`local`一样进行操作:

local exiter exiter = function(param) -- ... end


这意味着任何在该函数语句之前使用`exiter`的引用都不会指向新的局部变量。在赋值之前定义局部变量是必要的,以允许递归调用,这不等同并且不起作用:

local exiter = function(param) -- ... 这里无法递归调用exiter end

```

2014-08-08 16:09:30