从C API确定Lua函数的签名

卡里什

我正在使用的框架可以通过Lua模块进行扩展。每个模块的Lua源代码都是使用我们的基于官方Lua解释器的编译器进行编译的,然后保存为字节码。此类模块必须满足某些要求:

-- Must be a non-empty string consisting only of characters in the range a-z
name = "foo"

-- Must not only be a number, but also an integer greater than zero
version = 1

如果在Lua源代码被编译到模块中时可以检查需求,那就太好了。这将使生活更轻松:

  • 对于那些编写模块的人,因为他们会被告知犯了哪些错误;
  • 对我们而言,因为我们可以假设模块是正确的(就像假设安装的资源(例如图标)正确)一样,因此不必在运行时实施任何检查。

检查某个特定类型的值并不困难:

// lua_getglobal returns the type of the value
int r = lua_getglobal(lua_state, "name");
if ( r == LUA_TSTRING )
{
    // well done, dear module writer (well, must still check if the string contains
    // only valid characters)
}
else if ( r == LUA_TNIL )
{
    // error: `name' not defined
}
else
{
    // hey you, `name' should be a string!
}

但是,如何检查一个函数是否需要一定数量的参数并返回带有某些字段的表呢?

-- must be defined with two parameters
function valid_function( arg1 , arg2 )
    -- must return a table
    return {
        a = 17, -- with field `a', a number
        b = "a" -- with field `b', a string
    }
end

请注意,与这个问题不同,我在问C API是否可行(如果可以,如何),这是关于在Lua中进行此操作的问题

雨果

你不能这样做。每个Lua函数可以接受任意数量的参数并返回任意数量的任何类型的值。

我认为您最好的办法是在某处(在注释中或运行时出现的内容中)编写显式类型注释,然后进行检查。还有Typed Lua,它是带有静态类型系统的实验性Lua方言。


例如,函数如何接收任意数量的参数,如果函数接收的参数少于其具有参数的参数,则多余的参数将分配给nil如果传递的参数比函数作为参数传递的参数多,则多余的参数将被丢弃。

function foo(x, y)
    print(x,y)
end

foo()      -- prints nil, nil
foo(1)     -- prints 1,   nil
foo(1,2)   -- prints 1,   2
foo(1,2,3) -- prints 1,   2

缺少参数benil通常也用于实现带有可选参数的函数,这意味着幼稚的尝试检查参数数量将与以下通用Lua习惯冲突:

function hello(name)
    name = "mysterious stranger"
    print("Hello, "..name.."!")
end

返回参数也很灵活,就像输入参数一样:

function bar()
    return 1, 2
end

local x       = bar() -- second return value gets discarded
local x, y    = bar()
local x, y, z = bar() - z gets assigned to `nil`

许多Lua函数还根据条件返回不同数量的参数。例如,io.open如果可以打开文件,则返回一个值(文件句柄),如果不能打开,则返回两个值(nil后跟错误消息)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

从C API确定Lua函数的签名

来自分类Dev

Lua C API如何确定将函数称为类成员还是仅从表中调用函数?

来自分类Dev

在C / API中指定Python函数签名

来自分类Dev

Lua C API-将属性映射到函数

来自分类Dev

使用Lua C API在子表内插入函数

来自分类Dev

Lua C API:从Lua函数检索值,并以C代码返回表

来自分类Dev

从C ++调用Lua函数

来自分类Dev

从C ++调用Lua函数

来自分类Dev

C ++模板中的函数签名

来自分类Dev

lua函数转换为C ++函数

来自分类Dev

C ++中函数签名的定义顺序

来自分类Dev

Doxygen无法解析C函数指针签名

来自分类Dev

缩短C ++函数签名的标准方法

来自分类Dev

C ++中的函数签名和继承

来自分类Dev

Doxygen无法解析C函数指针签名

来自分类Dev

通过Lua C API有关函数参数的详细信息

来自分类Dev

Lua C API-使用相同名称的变量和函数加载多个文件

来自分类Dev

是否有不删除完整堆栈的 lua-c api 函数?

来自分类Dev

C API和lua类型

来自分类Dev

Lua C API:处理大量

来自分类Dev

如何确定C ++函数调用顺序?

来自分类Dev

动态确定C中函数参数的类型?

来自分类Dev

将Lua函数传递给C ++

来自分类Dev

Lua用C ++存储的匿名函数

来自分类Dev

从lua C函数返回几个参数

来自分类Dev

从C调用lua脚本返回的函数

来自分类Dev

从C ++调用未知(按名称)lua函数

来自分类Dev

lua同步调用C异步函数

来自分类Dev

无法从Lua-lanes调用C函数