一个简单的问题:如何为尚未实现的函数设置原型?
我只是想这样做,因为我指的是一个不存在的功能(还)。 在C中,我们会做这样的事情:
int foo(int bar);
int myint = foo(1);
int foo(int bar)
{
return bar;
}
我如何在Lua(带电晕)中做到这一点?
答案 0 :(得分:7)
你做不到。 Amber的评论是正确的。
Lua没有类型签名或函数原型的概念。
foo
的类型是它包含的对象的类型,它是动态的,在运行时更改。它可以在一个瞬间function
,string
或integer
或其他内容。
从概念上来说, Lua没有像C这样的编译步骤。当你说“运行此代码”时,它开始执行顶部的指令并使其顺利运行。在 practice 中,Lua首先在执行代码之前将代码编译成字节码,但编译器不会这样做:
greet()
function greet()
print('Hello.')
end
因为greet
中包含的值是在运行时确定的。只有当你真正尝试调用(即调用函数)时greet
中的值,在运行时,Lua才会发现它不包含可调用的值(函数)或者带有包含__call
成员的元表的表/用户数据,您将收到运行时错误:“尝试调用全局'问候'(零值)”。其中“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
已在_G
中声明,main
可以访问它。