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

Gre*_*reg 5 lua

创建函数的语法是什么,然后在代码中进一步添加它的实现?

所以大致是这样的:

  • 定义功能 doX
  • 致电doX (代码中更下)
  • doX 实现(即文件底部的所有功能)

Pau*_*nko 12

您只需要引用一个变量.local funcName只需一个警告即可满足您的目的.这将有效:

local funcName
function callIt()
  print(funcName())
end
function defineIt()
  funcName = function() return "My Function" end
end
defineIt()
callIt()
Run Code Online (Sandbox Code Playgroud)

只要defineIt在调用它()之前定义它(callIt),它就应该按预期工作.你不能做这样的事情(这是警告):

local funcName
print(funcName())
funcName = function() return "My Function" end
Run Code Online (Sandbox Code Playgroud)

你会收到一个错误:attempt to call local 'funcName' (a nil value).

  • 您不需要将函数定义包装在“defineIt”中。它将与 `funcName = function()...` 作为单独的行一起工作。毕竟这就是“本地函数 funcName()”的作用。 (2认同)

Nic*_*las 8

哦...所以在实际定义函数之前,真的没有办法调用funcName吗?即你仍然需要确保在第一次调用funcName本身之前调用defineIt?

我想澄清这一点,我觉得答案比评论更好.

Lua是一种比C或C++更简单的语言.它建立在一些简单的基础上,带有一些语法糖,使其部分容易吞咽.

Lua中没有"函数定义"这样的东西.函数是一流的对象.它们是Lua 中的,就像数字28或字符串文字"foo"是值."函数定义"只是将值(即函数)设置为变量.变量可以包含任何类型的值,包括函数值.

所有"函数调用"都是从变量中获取值并尝试调用它.如果该值是函数,则使用给定参数调用该函数.如果该值不是函数(或带有元方法的表/ __call用户数据),则会出现运行时错误.

您不能再调用尚未在变量中设置的函数,而不能执行此操作:

local number = nil
local addition = number + 5
number = 20
Run Code Online (Sandbox Code Playgroud)

并期望addition有25个.这不会发生.因此,出于同样的原因,你不能这样做:

local func = nil
func(50)
func = function() ... end
Run Code Online (Sandbox Code Playgroud)

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


Mic*_*man 5

正如其他人所写的那样,您无法在运行时调用尚未在调用之前分配的函数。您必须了解:

function myFunc() print('Something') end
Run Code Online (Sandbox Code Playgroud)

仅仅是一个语法糖:

myFunc = function() print('Something') end
Run Code Online (Sandbox Code Playgroud)

现在,这种代码将无法按您希望的方式工作:

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

使用该greeter变量时,其值为nil,因为其值仅在下一行设置。

但是,如果要将“ main”程序放在顶部,将函数放在底部,则有一种简单的方法可以实现此目的:创建一个“ main”函数,并在底部将其作为最后一件事调用。到该函数被调用时,所有函数将被设置为相应的全局变量:

-- start of program, your main code at the top of source code
function main()
    local name = readName()
    local message = greeter(name)
    print(message)
end

-- define the functions below main, but main is not called yet,
-- so there will be no errors
function readName() io.write('Your name? '); return io.read() end
function greeter(name) return 'Hello, ' .. name end

-- call main here, all the functions have been assigned,
-- so this will run without any problems
main()
Run Code Online (Sandbox Code Playgroud)