我有一个看起来像这样的模块。我已经大大简化了它,以免弄乱我的问题(我的本地函数比这更复杂)。这是我的代码:
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'成为一个公共方法。我希望win
,lose
和draw
是私有的,但我想从get_decision
动态调用它们。如果我理解正确,win
和lose
现在在全局命名空间中?如果我在这两种方法(如local
)之前加上draw
,那么我的代码就不起作用了。
有没有办法完成我的目标?
答案 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
。