【问题标题】:Can I dynamically call a local function?我可以动态调用本地函数吗?
【发布时间】:2014-01-31 12:31:40
【问题描述】:

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

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

有没有办法完成我所追求的?

【问题讨论】:

  • 您可能希望将decision 和其他函数设为本地。

标签: oop lua namespaces private public


【解决方案1】:

当然。

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

ma​​in.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 后面。

【讨论】:

  • 谢谢!不知道我会不会想到这一点。很高兴我问。现在我需要知道如何动态调用一个模块。现在将发布另一个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-20
  • 1970-01-01
  • 2021-04-09
  • 2017-09-30
  • 2022-06-15
  • 2012-03-16
  • 1970-01-01
相关资源
最近更新 更多