Lua元表,如何转发未定义的函数?

我有一个空表,我想让它充当到另一个位置的另一组函数的“网关”。

tbl = {}

我希望将从该表调用的函数作为字符串传递到其他位置:

tbl.someMethod("hello")

我尝试了这个,但效果有限。

hand = {
    __index = function(tbl,name)
      hand[name] = function(...)
          passToSomewhere(name,...)
      end
    end,
    __call = function(tbl,name,...)
        hand[name](...)
    end
}
setmetatable(tbl,hand)
tbl.someFunction("hello!", someTbl,someNumber)

如何通过表转发未定义的函数,而不会抛出错误?

编辑:更多细节

我正在尝试在一次调用中定义和调用表中的函数:

tbl = {}

hand = {
  __index = function(tbl,name)
    print(name)
    tbl[name] = function(...)
      print(...)
    end
  end
}
setmetatable(tbl,hand)

s,e = pcall(tbl.help,"banana""goat")
print(s)

s,e = pcall(tbl.help,"banana""goat")
print(s)

这段代码确实起作用,但第一个 pcall 会抛出错误,因为函数还没有被定义。

假设我想使用一个我知道会经常更新并使我的脚本兼容的库,而且这个库可能不存在于我的计算机上。我想要在某个接口上转发对此库的调用,但我仍然希望能以同样的方式调用这些函数。

-例如,我想用这种方式调用这个函数:
someLib.doSomething(name,age,telephone)

-而不是将其传递到另一个函数中:
someOtherLib.invoke("someLib.doSomething",name,age,telephone)

这可能吗?

编辑 2:

谢谢 @greatwolf!

这是我的工作测试代码。

tbl = {}

hand = {
  __index = function(tbl,name)
    tbl[name] = function(...)
      return print(name,...)
    end
    return rawget(tbl,name)
  end
}
setmetatable(tbl,hand)

tbl.help("banana""goat")
点赞
用户234175
用户234175

好的,根据您更新的细节,您希望lua将此调用翻译成

someOtherLib.invoke("someLib.doSomething", name, age, telephone)

在幕后执行。你已经很接近了,你只需要把新创建的函数返回即可:

__index = function(tbl, name)
  tbl[name] = function(...)
    return someOtherLib.invoke("someLib."..name, ...)
  end
  -- return tbl[name] works too, I used rawget to indicate
  -- no further __index lookup should be done
  return rawget(tbl, name)
end

现在,如果您的someOtherLib只是一组函数的表格,LHF的建议也可以运行

setmetatable(tbl, {__index = someOtherLib})

现在如果您的someOtherLib提供了某种获取要调用的函数的方法,而不实际调用它,__index可以转发这个方法而不创建额外的闭包包装器。

__index = function(tbl, name)
  tbl[name] = someOtherLib.getFuncByName(name)
  return tbl[name]
end

这里不需要__call元方法。

2015-01-20 08:56:19