Domanda

I have a module that looks like this. I've simplified it greatly so as not to clutter up my question (my local functions are more complex than this). Here is my code:

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

I am calling my module with the code below.

my = require "my-lua-script"

print(my.get_decision(lose, "I lose."))
print(my.get_decision(win, "I win."))

I want 'get_decision' to be a public method. I want win, lose and draw to be private, but I want to call them dynamically from get_decision. If I understand correctly, win and lose are in the global namespace right now? If I put a local in front of these two methods (like draw) then my code doesn't work.

Is there a way to accomplish what I am after?

È stato utile?

Soluzione

Of course.

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.'))

You simply use a string to indicate which function you'd like to access, and use that string to index a table of functions from within get_decision against outcomes. This will keep the functions hidden behind get_decision.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top