2017-11-12 4 views
1

를 통해 '네임 스페이스를 사용하여'나는 파일 foo.lua이있는 경우 : bar.lua에 내가 foo.add() 모든 시간을 입력하여 방해하고 foo.lua의 코드를 많이 사용하고 작성하는 것을 선호C를 에뮬레이션 ++ _ENV

local foo = {} 
foo.add = function(a, b) return a+b end 
foo.sub = function(a, b) return a-b end 
foo.multiply = function(a, b) return a*b end 
return foo 

local foo = require('foo') 
local add, sub, multiply = foo.add, foo.sub, foo.multiply 

을하지만 당신이 많은 파일에서 많은 값을 앨리어싱 포함되어 통증이있을 시작 : 단지 add()bar.lua에서 나는이를 추가 할 수 있습니다.

난 당신과 같이이 기능을 에뮬레이션 할 수있는 생각 루아에서
#include <iostream> 
using namespace std 

가 : C++에서이 주위에 방법이 있으므로

내가 무엇을 말할 수에서
local foo = require('foo') 
setmetatable(_ENV, {__index = foo}) 

이 범위를 존중 코드 같은 것 아래의 코드는 작동하지 않습니다.

실제로 아래 코드는 작동하지 않습니다. 나는 lua repl을 통해 코드를 실행하고 있었다. 아래 코드 조각을 lua 파일에 썼을 때 원하는 결과를 얻지 못했습니다.

f = function() -- returns 2 
    setmetatable(_ENV, {__index = foo}) 
    return add(1, 1) 
end 
add(1, 1) -- returns 2 

이 작업을 후회할만한 이유가 있습니까? (이외에도 이유는 using namespace)

+0

이러한 방식으로 C++을 사용하는 것은 점차 빈약 한 실천으로 간주되고 있습니다. –

+1

나는 C++에서 인기가 없다는 이유를 알고 있으며,이 스레드에 대한 응답을 얻은 후에 루아 코드 전체에 퍼팅을 시작합니다. 가능한 경우 코드를 읽기 쉽지 않게하기 때문에 고급 지식을 필요로하는 코드 작성을 피하는 경향이 있습니다. 이는 분명히 해당 규칙을 위반하는 것입니다. 나는 단지 궁금했다. – Julian

답변

1

다른 환경에서는 지구 환경이 바뀌지 않습니다. add 원래 _ENVfooprint에서 해결 될 것

do 
    local _ENV = setmetatable(foo, {index = _ENV}) 
    print(add(1, 1)) 
end 

참고 :

다른 방법으로 주위를 사용해보십시오.