创建函数的语法是什么,但是然后在代码中进一步添加它的实现?
大致如此:
doX
doX
(代码中更下方)doX
实施(即文件底部的所有功能)答案 0 :(得分:12)
您只需要引用一个变量即可。 local funcName
只需一个警告即可满足您的目的。这将有效:
local funcName
function callIt()
print(funcName())
end
function defineIt()
funcName = function() return "My Function" end
end
defineIt()
callIt()
只要在调用它(defineIt
)之前定义它(callIt
),它就应该按预期工作。你不能做这样的事情(这是警告):
local funcName
print(funcName())
funcName = function() return "My Function" end
您将收到错误:attempt to call local 'funcName' (a nil value)
。
答案 1 :(得分:8)
哦...所以在实际定义函数之前,真的没有办法调用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所指出的,你可以从你定义的另一个函数中调用一个函数。但是你不能执行调用它的函数,直到你用它需要包含的内容填充该变量。
答案 2 :(得分:5)
正如其他人所写,您无法在运行时调用未在调用之前分配的函数。你必须明白:
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
,因为其值仅在下一行设置。
但是如果你想让你的“主”程序在顶部,而功能在底部,那么有一种简单的方法可以实现这一点:创建一个“主”功能并将其称为底部的最后一个。调用函数时,所有函数都将设置为相应的全局变量:
-- 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()