2014-02-06 2 views
1

제 스크립트에서는 다른 모듈에서 "가져 오기"기능을 수행합니다. 따라서 스크립트 시작 부분에 다음과 유사한 코드가 있습니다.루아에서 많은 이름 가져 오기

local some_function = assert(require("utils").some_function) 
local another_func = assert(require("utils").another_func) 
local yet_another = assert(require("utils").yet_another) 
local and_another = assert(require("utils").and_another) 

그러나이 코드는 꽤 읽을 수 없습니다.

합니다 (assert()는 함수 이름에 맞춤법 오류를 방지 할 수있다.) 나는, 내가 쉽게 내 자신의 함수를 작성할 수 있다는 것을 알고 require_names() 말을하고,에 위의 코드를 설정

:

local some_function, another_func, yet_another, and_another 
    = require_names("utils", { "some_function", "another_func", "yet_another", "and_another" }) 

이 모양은 보다 많이입니다. 여전히 최적이 아닙니다.이 코드에는 중복성이 있습니다. 함수의 이름이 두 번 반복됩니다.

이중화 문제가 발생하지 않도록 require_names()을 쓸 수있는 방법이 있습니까?

또는 다른 방법으로 가독성 문제를 해결하기위한 아이디어가 있습니까?

은 당신이 할 수없는, 당신이 유틸 모듈에서 무엇의 일부만을 원하는 경우에

+2

'setmetatable (_G, {__index = "유틸"을 요구})'당신은 단지 하나 개의 모듈을 사용할 때 –

+0

에고의 솔루션만큼 괜찮습니다. 해당 솔루션을 사용하면 두 모듈을 동시에 상속받을 수 없습니다. – lhf

+0

루아 5.2에서'_ENV = require "utils"'할 수 있으며 모든 전역 변수는'utils'에서 해결됩니다. – lhf

답변

1

, 아직 전용 지역을 만들 (둘 다 루아 5.1 및 5.2에서 실행되는 솔루션이 필요합니다). 다른 답변은 전체 utils 모듈을 제공합니다.이 경우에는 require 'yourmodule'을 사용하지 않는 이유가 없습니다. 그런 다음 지역 주민, 양도 할 수있는 경우 :에

function require_names(modName, objNames) 
    for i,v in ipairs(objNames) do 
     _G[v] = assert(require(modName)[v]) 
    end 
end 

작품을 모두 5.1 :

유일한 비 전역 옵션은 로컬 테이블에서 당신이 원하는 것을 넣어하는 것입니다
> print(setn) 
nil 
> print(insert) 
nil 
> require_names("table", {"setn", "insert"}) 
> print(setn) 
function: 005F7910 
> print(insert) 
function: 005F7890 

만 부분 집합을 얻을 수 있습니다 필요 :

function require_names(modName, objNames) 
    local mod = {} 
    for i,v in ipairs(objNames) do 
     mod[v] = assert(require(modName)[v]) 
    end 
    return mod 
end 

local utils = require_names("utils", { 'a', 'b' }) 
utils.a = asdfasf 
print(utils.b) 

그러나 local utils=require 'utils'에 비해 위의 유일한 장점은 필요한 모듈에서 사용하려고하는 당신이 모듈 문서화한다는 것입니다. 그러나 모든 인용문과 중괄호는 약간 시끄 럽습니다.

0

내가 이런 짓을 했을까 :

local u = require 'utils' 

다음과 같이 사용 :

u.some_function(...) 

이 입력하는 것은 매우 쉬운 매우 분명하다. 일반 require + extract : 당신이 정말로 지역 주민들이 필요하면

은, 그때 require_names하지만이라는 단일 기능을 사용하지 않을 것입니다. 여기 extract

local function extract(t, keys) 
    local values = {} 
    for i=1, #keys do values[i] = t[keys[i]] end 
    return unpack(values) 
end 

사용법이다 :

local utils = require 'utils' 
local some_function, another_func, yet_another, and_another = 
    extract(utils, { "some_function", "another_function", "yet_another", "and_another"}) 
+0

감사합니다. 왜 require + extract는 하나의 함수보다 당신에게 더 우아한 것처럼 보입니까? (직관적으로 나는 그것이 더 우아하다는 것을 알지만 생각의 방식을 듣고 싶다.) –

+0

나는 얼마 전 그것에 관해 썼다. [여기 내 생각이야] (http://kikito.github.io/blog/2012/03/16/small-functions-are-good-for-the-universe/) – kikito