4

一个简单的问题:如何为尚未实现的功能设置原型?

我只是想这样做,因为我指的是一个还不存在的函数。在 C 中,我们会做这样的事情:

int foo(int bar);

int myint = foo(1);

int foo(int bar)
{
     return bar;
}

我如何在 Lua(使用电晕)中做到这一点?

4

1 回答 1

7

你不能。琥珀的评论是正确的。

Lua 没有类型签名或函数原型的概念。

的类型foo是它包含的对象的类型,它是动态的,在运行时会发生变化。它可能function在某一瞬间发生,string或者integer在下一瞬间发生。

从概念上讲,Lua 没有像 C 那样的编译步骤。当你说“运行这段代码”时,它开始从顶部开始执行指令,然后向下运行。在实践中,Lua 在执行之前首先将你的代码编译成字节码,但是编译器不会对这样的事情犹豫不决:

greet()

function greet()
    print('Hello.')
end

因为其中包含的值greet是在运行时确定的。只有当你在运行时实际尝试调用(即像函数一样调用)中的值greet时,Lua 才会发现它不包含可调用值(函数或表/用户数据,其元表包含一个__call成员)你会得到一个运行时错误:“尝试调用全局'greet'(一个零值)”。其中“nil value”是greet尝试调用时包含的任何值。在我们的例子中,它是nil.

因此,您必须确保foo在尝试调用之前调用了创建函数并将其分配给的代码foo


如果您认识到这一点可能会有所帮助:

local myint = foo(1)

function foo(bar)
     return bar
end

是语法糖吗:

local myint = foo(1)

foo = function(bar)
     return bar
end

foo正在被分配一个函数值。这必须在您尝试调用该函数之前发生。


这个问题最常见的解决办法就是把文件的函数当作“编译时间”,即:在文件执行时声明你所有的常量数据和函数,准备好在“执行时间”使用。然后,调用一个main函数开始“执行时间”。

例如:

function main()
    greet()
end

function greet()
    print('Hello.')
end

main()

正如greet在 中声明的那样_Gmain可以访问它。

于 2012-04-22T20:56:42.967 回答