【问题标题】:Accessing userdata properties and methods in Lua在 Lua 中访问 userdata 属性和方法
【发布时间】:2013-12-07 13:15:51
【问题描述】:

我有一个关于在 LuaInterface 中访问用户数据类型的问题。当我将 C# 字典传递给 Lua 并尝试使用 ipairs 对其进行迭代时,我收到一个错误,因为 ipairs 需要一个表而不是 userdata 对象。

我想一种解决方案是在将 Dictionary 类型传递给 Lua 之前将其转换为 LuaTable 类型,但我想将 userdata 类型用于其中的一种用途是将 Dictionary 对象引入 Lua 并更新customType 对象并在 Lua 中调用它们的方法。我不知道这是否可能,但我很确定如果我将该 Dictionary 转换为字符串和整数的 LuaTable,我将失去任何直接与 Lua 中的 customType 交互的机会。

我在网上查找了有关在 Lua 中使用 userdata 的信息,但我发现了几个通过 C/C++ 与 Lua 接口的示例以及我不太了解的堆栈。此外,在某些情况下使用 sizeof 方法,这在 c# 中没有简单的替代方法。有人可以给我一些指示吗?关于 C 中用户定义类型的 PIL 部分也没有太大帮助。

【问题讨论】:

标签: c# dictionary lua luainterface lua-userdata


【解决方案1】:

要使用 LuaInterface/NLua 遍历集合元素,您需要使用 luanet.each 而不是 ipairs。您无需从 Dictionary 创建 LuaTable。

luanet.each 将使用GetEnumeratorMoveNextCurrent 来遍历字典。

函数 luanet.each(o) 本地 e = o:GetEnumerator() 返回函数() 如果 e:MoveNext() 那么 返回 e.Current 结尾 结尾 结尾

改为for x in ipairs(dict) 使用for x in luanet.each (dict)

参考:https://github.com/NLua/NLua/blob/079b7966245cccb42c563abeb19290459e10934e/Core/NLua/Lua.cs#L245

【讨论】:

  • 当我尝试在 Lua 中运行此代码时出现异常:尝试调用 GetEnumerator(一个 nil 值)。我不确定为什么?我正在加载程序集 System.Collections.Generic
  • 但是,当我的 Dictionary 类型为 时,这不起作用。 x 返回值 [one,PointClick.Pause+testClass]。如何访问 testClass 属性和方法?
  • 另外,x 返回的是什么类型?如果我回到 Dictionary 它输出 [one,1] 但这不是一个表,因为 x[1] 返回 1 并且 x[1][1] 返回错误尝试索引? (一个数值)...
  • x 将是您的 Dictionary 值的类型,以访问您需要使用的方法和属性:或。就像使用常规 .NET 对象时一样。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-30
  • 2011-05-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多