我可以动态调用本地函数吗?

时间:2014-01-12 20:20:48

标签: oop lua namespaces private public

我有一个看起来像这样的模块。我已经大大简化了它,以免弄乱我的问题(我的本地函数比这更复杂)。这是我的代码:

decision = {}

function win(win_arg) return win_arg end
function lose(lose_arg) return lose_arg end
local function draw(draw_arg) return draw_arg end

function decision.get_decision(func, arg)
  return func(arg)
end

return decision

我使用下面的代码调用我的模块。

my = require "my-lua-script"

print(my.get_decision(lose, "I lose."))
print(my.get_decision(win, "I win."))

我希望'get_decision'成为一个公共方法。我希望winlosedraw是私有的,但我想从get_decision动态调用它们。如果我理解正确,winlose现在在全局命名空间中?如果我在这两种方法(如local)之前加上draw,那么我的代码就不起作用了。

有没有办法完成我的目标?

1 个答案:

答案 0 :(得分:3)

当然。

我-script.lua

-- This is the local side of the module.
local outcomes = {}

function outcomes.win(arg) return arg end
function outcomes.lose(arg) return arg end
function outcomes.draw(arg) return arg end

-- This is the exposed side of the module.
local M = {}

function M.get_decision(outcome, arg)
  return outcomes[outcome](arg)
end

return M

<强> main.lua

local my = require'my-script'

print(my.get_decision('win', 'I win.'))
print(my.get_decision('lose', 'I lose.'))

您只需使用字符串来指示您要访问的功能,并使用该字符串将get_decision内的函数表与outcomes编入索引。这会将功能隐藏在get_decision

之后