我有一个看起来像这样的模块。我已经大大简化了它,以免使我的问题变得困惑(我的本地函数比这更复杂)。这是我的代码:
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”成为公共(public)方法。我希望 win
、lose
和 draw
是私有(private)的,但我想从 get_decision
动态调用它们。如果我理解正确的话, win
和 lose
现在位于全局命名空间中?如果我在这两个方法前面放置一个 local
(例如 draw
),那么我的代码将无法工作。
有没有办法实现我所追求的目标?
最佳答案
当然。
my-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
中索引函数表。这将使函数隐藏在 get_decision
后面。
关于oop - 我可以动态调用本地函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21079822/