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

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

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),那么我的代码不起作用。

有办法实现我想要的吗?

点赞
用户828255
用户828255

当然。

my-script.lua

-- 这是模块的本地端。
local outcomes = {}

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

-- 这是暴露的模块端。
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 后面。

2014-01-12 20:49:57