8

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

所以大致是这样的:

  • 定义函数doX
  • 调用doX (代码中的更下方)
  • doX实现(即文件底部的所有功能)
4

3 回答 3

14

你只需要有一个变量来引用。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)

于 2012-09-05T23:49:24.143 回答
10

哦……那么在实际定义函数之前真的没有办法调用 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

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

于 2012-09-06T03:36:20.660 回答
6

正如其他人所写的那样,您不能在运行时调用在调用之前尚未分配的函数。你必须明白:

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()
于 2012-09-06T10:39:18.587 回答