2014-01-12 2 views
2

다음과 같은 모듈이 있습니다. 내 질문을 혼란스럽게하지 않도록 크게 단순화했다. (내 로컬 함수는 이것보다 복잡하다.) 여기 내 코드는 다음과 같습니다.동적으로 로컬 함수를 호출 할 수 있습니까?

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'을 공용 메소드로 지정합니다. win, losedraw을 비공개로하고 싶지만 get_decision에서 동적으로 호출하고 싶습니다. 올바르게 이해한다면 winlose은 현재 글로벌 네임 스페이스에 있습니까? 이 두 메서드 앞에 local을 넣으면 (예 : draw) 코드가 작동하지 않습니다.

내가 수행 한 작업을 수행 할 수있는 방법이 있습니까?

+0

아마도'결정'과 다른 기능을 로컬로 만들고 싶을 것입니다. – lhf

답변

3

물론.

내-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에서 outcomes에 대한 함수 표를 색인화하십시오. 이것은 get_decision 뒤에 숨겨진 기능을 유지합니다.

+0

고마워! 내가 이것을 알아 냈을 지 확신 할 수 없다. 다행입니다. 이제 동적으로 모듈을 호출하는 방법을 알아야합니다. 지금 다른 질문을 게시 할 것입니다. – Kelly