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

标签 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”成为公共(public)方法。我希望 winlosedraw 是私有(private)的,但我想从 get_decision 动态调用它们。如果我理解正确的话, winlose 现在位于全局命名空间中?如果我在这两个方法前面放置一个 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

ma​​in.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/

相关文章:

java - 像 getSystemService() 这样的 "String-Based"API 有什么好处?

multithreading - Lua - 如何模拟 "multithreading"?

使用具有不匹配变量的类的 Python 多重继承

r - 将非 S3 基本函数重新定义为 R 包中的 S3 函数是不好的风格吗?

string - 使用 Lua 从 URL 获取文件名

xslt - 当命名空间是动态时,如何在 XSLT 文件中提及命名空间?

c++ - 对`(匿名命名空间)的 undefined reference ::

namespaces - 如何在 tcl 命名空间中定义一个 proc

java - java SWING应用程序的设计问题

lua - 在什么编程范式下可以使用 Lua?