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

Lua metatable, how to forward undefined functions?

我有一个空的 table,我想将其用作另一个位置的另一组函数的 "gateway"。

tbl = {}

我想将此 table 中的调用函数作为字符串传递到其他地方:

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)

如何通过 table 转发未定义的函数而不引发错误?

编辑:更多细节

我正在尝试在一个 table 中定义并调用一个函数:

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 将抛出错误,因为尚未定义该函数。

假设我想使用一个我知道经常更新并保持我的脚本兼容的库,但我的计算机上可能不存在该库。我想通过某些接口转发对该库的调用,但我仍然希望能够以相同的方式调用这些函数。

--For example I would like to call this function like this:
someLib.doSomething(name, age, telephone)

--Instead of passing it through another function:
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")

好的,根据您更新的详细信息,您希望lua翻译此电话

someLib.doSomething(name, age, telephone)

进入

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

幕后。你所拥有的已经差不多了,你只需要 return 新创建的函数返回:

__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 只是一个 table 函数,lhf 的建议也行得通

setmetatable(tbl, {__index = someOtherLib})

现在,如果您的 someOtherLib 提供了某种方式来获取您想要调用的函数,而无需实际调用它,__index 可以在不创建额外的闭包包装器的情况下转发它

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

此处不需要 __call 元方法。