Lua - 反射 - 函数参数和文档字符串?

时间:2012-06-05 17:34:19

标签: reflection lua

我是从Python来到Lua的。我正在使用Lua C API。我想知道是否有一种标准方法可以将一些参数和使用信息与方法捆绑在一起,并将其与标准help()<method>.__doc__()类似的方法联系起来。

我有一些想法:

1)以某种方式将文档放入库metatable并让用户使用pairs()

static const luaL_Reg lua_mylib_funcs[] = {
    ...
    {NULL, NULL}};

2)在没有参数的情况下调用方法时打印一些用法信息。

3)为库创建.help().docs()方法。

有人能指出“Lua-ish”的方向吗?

2 个答案:

答案 0 :(得分:2)

  

我想知道是否有标准方法将一些参数和使用信息与方法捆绑在一起

不。

  

以某种方式将文档放在库metatable中并让用户使用pairs():

您可以建立一个约定,如果方法名称为foo,则将文档存储在foo_docs或类似的内容中。

x.foo_docs = "returns the sum of three numbers"
function x:foo(a,b,c)
   return a + b + c
end
  

在没有参数的情况下调用方法时打印一些用法信息。

这会阻止您创建没有参数的方法。

  

有人能指出“Lua-ish”的方向吗?

如果没有真正知道为什么需要它以及你喜欢它如何工作,有点难以说。要获得类似<method>.__doc__的内容,您可以将方法(即函数)转换为可调用表,这样可以将其编入索引并存储您想要的任何元数据,但这样做很丑陋并且需要为每个方法创建一个新表。例如,这可以让您将方法转换为可调用的表:

local documentMethodMetatable = {}
function documentMethodMetatable.__call(t,...)
  return t.method(...)
end
function documentMethod(method, doc)
  return setmetatable({ method=method, doc=doc}, documentMethodMetatable)
end

然后你可以写下这样的东西:

local foo = {name="Donut"}
function foo:sum(a,b,c)
  print(self.name .. " says the sum is " .. (a + b + c))
end

foo.sum = documentMethod(foo.sum, "Receives three arguments and prints their sum.")

foo:sum(2,2,3)     --> call sum
print(foo.sum.doc) --> index sum to get docs

答案 1 :(得分:1)

我见过this solution at lua-users wiki,如果那就是你要找的东西?