Lua:如何在函数定义之前调用函数?

如何在代码中定义一个函数并在后面添加实现?

大致如下:

  • 定义函数 doX
  • 在代码的后面调用 doX
  • doX 的实现(即在文件底部的所有函数)
点赞
用户1442917
用户1442917

你只需要有一个变量来引用。 local funcName 对于你的目的来说足够了,有一个注意事项。这样做是可行的:

local funcName
function callIt()
  print(funcName())
end
function defineIt()
  funcName = function() return "My Function" end
end
defineIt()
callIt()

只要在调用之前定义它( defineIt),它应该像预期的那样工作。但是你不能这样做(这就是注意事项):

local funcName
print(funcName())
funcName = function() return "My Function" end

你将获得一个错误: attempt to call local 'funcName' (a nil value)

2012-09-05 23:49:24
用户734069
用户734069

哦...那么在实际定义函数之前,真的没有办法调用 funcName 吗?也就是说,在第一次调用 funcName 之前,您仍然需要确保先调用 defineIt?

我想澄清这一点,并且我觉得回答比评论更好。

Lua是比C或C++简单得多的语言。它建立在一些简单的基础之上,并具有一些语法糖,使它的某些部分更容易接受。

在Lua中不存在“函数定义”这样的东西。函数是一级对象。它们是Lua中的值,就像数字28或字符串文字“foo”一样都是值。 “函数定义”只是将一个值(即函数)设置到变量中。变量可以包含任何类型的值,包括函数值。

“函数调用”只是从变量中获取值并尝试调用它。如果该值是函数,则使用给定的参数调用函数。如果该值不是函数(或具有 __call 元方法的表/用户数据),则会发生运行时错误。

你无法调用尚未设置到变量中的函数,就像你不能这样做一样:

local number = nil
local addition = number + 5
number = 20

并期望 addition 中有25。这是不可能的。因此,出于相同的原因,您不能这样做:

local func = nil
func(50)
func = function() ... end

正如Paul所指出的那样,您可以在定义的另一个函数内调用函数。但是在用它需要包含的内容填充该变量之前,您无法_执行_调用它的函数。

2012-09-06 03:36:20
用户221509
用户221509

如其他人所写,你在运行时不能调用没有事先被赋值的函数。你必须明白:

function myFunc() print('Something') end

只是这个的语法糖:

myFunc = function() print('Something') end

现在,这种代码不按你想象的那样运行是有道理的:

print(greeter(io.read())) -- attempt to call global 'greeter' (a nil value)
function greeter(name) return 'Hello '..name end

当你使用greeter变量时,它的值是nil,因为它的值只在下一行设置。

但是,如果你想在上面有你的“主”程序而在下面有函数,有一个简单的方法可以做到:创建一个“主”函数,并把它作为底部的最后一个调用。当函数被调用时,所有的函数将会被设置到相应的全局变量:

-- 程序开始,将你的主要代码放在源代码的顶部
function main()
    local name = readName()
    local message = greeter(name)
    print(message)
end

-- 在main下面定义函数,但是还没有调用main,
-- 所以不会出现任何错误
function readName() io.write('Your name? '); return io.read() end
function greeter(name) return 'Hello, ' .. name end

-- 在这儿调用main,所有函数都已经被分配,
-- 所以这将不会出现任何问题
main()
2012-09-06 10:39:18