【问题标题】:Lua using optional table values with the C APILua 使用带有 C API 的可选表值
【发布时间】:2019-02-20 03:57:16
【问题描述】:

我正在将表 { Value1=100, Value2=200, Value3=300, ...} 从 Lua 传递到 C。以下内容非常适合我所需的值:

// Get the values from the table
lua_getfield(L, 2, "Value1");
lua_getfield(L, 2, "Value2");
lua_getfield(L, 2, "Value3");

const char *value_3 = luaL_checkstring(L, -1);
const char *value_2 = luaL_checkstring(L, -2);
const char *value_1 = luaL_checkstring(L, -3);

但我需要处理表中的可选字段,其中一些在编译时可能不知道 - 但会在运行时知道。根据我所有的搜索,我认为我需要使用元表来替换 lua_getfield() 操作的表上的 __index 方法以返回 NIL,而不是在找不到特定键时抛出错误。然后我可以使用 luaL_checktype() 来测试。

我已经成功地使用了带有 userdata 的元表。但尽管如此,我真的不知道该怎么做。

【问题讨论】:

  • lua_getfield 会抛出错误吗?
  • 获取tour、阅读How to Askminimal reproducible example。几乎完美的问题陈述,除了您需要实际提出问题。
  • 不,但是 luaL_checkstring() 会抛出一个错误。 5.2 版 lua_getfield() 是一个 void 函数。这在 5.3 中发生了变化,它现在返回类型,如果在表中找不到键,则包括 nil/0。我正在使用 5.3 库,但指的是 5.2 参考手册。

标签: c lua


【解决方案1】:

无需使事情过于复杂。如果您想在 Lua 中生成默认值,请使用元表,但如果您可以在 C 中获取它,则非常容易。如果在表中找不到密钥,lua_getfield 将生成 nil,因此您可以将其返回值与 LUA_TNIL 进行比较,以检查它是否返回 nil(如果使用较旧的 API,则返回 lua_isnil)。在这种情况下,请使用您的默认值,或照常使用luaL_checkstring

【讨论】:

  • 感谢您的回复。我的问题是我指的是我购买了印刷版的 5.2 参考手册。在 5.2 版中,lua_getfield() 是一个 void 函数。我似乎在 5.3 中发生了变化——这是我实际使用的。是的,只需检查返回值就可以解决我的问题。谢谢!
  • 为了完整起见,在 Lua 5.2 及更早版本中,您可以在值上使用lua_type,这会给您带来相同的结果。
猜你喜欢
  • 2014-07-14
  • 1970-01-01
  • 2015-02-15
  • 2015-05-31
  • 2011-02-17
  • 2014-08-19
  • 2013-02-08
  • 2011-05-30
  • 2016-02-23
相关资源
最近更新 更多