Lua 모듈 및 패키지

모듈은 하나의 봉인 라이브러리와 유사하다. Lua5.1부터 Lua는 표준적인 모듈 관리 메커니즘을 추가했다. 일부 공용 코드를 한 파일에 넣고 API 인터페이스의 형식으로 다른 곳에서 호출하면 코드의 재사용과 코드 결합도를 낮출 수 있다.
Lua의 모듈은 변수, 함수 등 이미 알고 있는 요소로 구성된 테이블이기 때문에 하나의 모듈을 만드는 것은 매우 간단하다. 바로 테이블을 만들고 내보내야 할 상수, 함수를 그 안에 넣고 마지막에 이 테이블로 돌아가면 된다.다음은 사용자 정의 모듈 모듈을 만드는 것입니다.lua, 파일 코드 형식은 다음과 같습니다.
--    module.lua
--      module   module={}--      module.constant ="      "--      functionmodule.func1()
    io.write("        !
"
)endlocalfunction func2()print(" !")endfunctionmodule.func3() func2()endreturnmodule

위에서 알 수 있듯이 모듈의 구조는 하나의 테이블 구조이기 때문에 테이블의 요소를 조작하는 것처럼 모듈의 상수나 함수를 조작할 수 있다.
위의func2는 프로그램 블록의 국부 변수, 즉 하나의 사유 함수를 표시하기 때문에 외부에서 모듈에 접근할 수 없는 이 사유 함수는 반드시 모듈의 공유 함수를 통해 호출해야 한다.

require 함수


Lua는 모듈을 로드하기 위해 Require라는 함수를 제공합니다.모듈을 불러오려면 간단하게 호출하면 된다.예를 들면 다음과 같습니다.
require("<   >")

혹은
require"<   >"

Require를 실행하면 모듈의 상수나 함수로 구성된 테이블을 되돌려주고, 이 테이블을 포함하는 전역 변수를 정의합니다.
-- test_module.php   --module        module.lua
require("module")print(module.constant)module.func3()

위의 코드 실행 결과는 다음과 같습니다.
      

또는 로드된 모듈에 호출하기 쉬운 별칭 변수를 정의합니다.
-- test_module2.php   --module        module.lua
--     m
local m =require("module")print(m.constant)
 
m.func3()

위의 코드 실행 결과는 다음과 같습니다.
      

로드 메커니즘


사용자 정의 모듈에 대해 모듈 파일은 어느 파일 디렉터리에 두어도 되는 것이 아닙니다. 함수 Require는 자신의 파일 경로 로드 정책을 가지고 있으며, Lua 파일이나 C 프로그램 라이브러리에서 모듈을 로드하려고 시도합니다.
require에서 Lua 파일을 검색하는 경로는 전역 변수 패키지에 저장됩니다.path에서 Lua가 시작되면 환경 변수 LUAPATH 값은 환경 변수를 초기화합니다.이 환경 변수를 찾지 못하면 컴파일할 때 정의한 기본 경로를 사용해서 초기화합니다.
물론 LUA가 없으면PATH라는 환경 변수는 현재 사용자 루트 디렉토리에서 열기 위한 사용자 정의 설정도 가능합니다.profile 파일 (없으면 생성하고.bashrc 파일을 열어도 됩니다), 예를 들어 "~/lua/"경로를 LUA 에 추가합니다.PATH 환경 변수:
#LUA_PATHexport LUA_PATH="~/lua/?.lua;;"

파일 경로는;번호 구분, 마지막 2개 ";"새로 추가된 경로 뒤에 원래 기본 경로가 추가됨을 나타냅니다.
그런 다음 환경 변수 매개 변수를 업데이트하여 즉시 적용합니다.
source ~/.profile

이 때 패키지를 가정합니다.path 값은 다음과 같습니다.
/Users/dengjoe/lua/?.lua;./?.lua;/usr/local/share/lua/5.1/?.lua;/usr/local/share/lua/5.1/?/init.lua;/usr/local/lib/lua/5.1/?.lua;/usr/local/lib/lua/5.1/?/init.lua

그러면 Require ("module") 를 호출할 때 다음 파일 디렉터리를 열어 대상을 검색하려고 시도합니다.
/Users/dengjoe/lua/module.lua;./module.lua
/usr/local/share/lua/5.1/module.lua
/usr/local/share/lua/5.1/module/init.lua
/usr/local/lib/lua/5.1/module.lua
/usr/local/lib/lua/5.1/module/init.lua

대상 파일을 찾으면 패키지가 호출됩니다.loadfile에서 모듈을 불러옵니다.그렇지 않으면 C 프로그램 라이브러리를 찾을 것입니다.
검색된 파일 경로는 전역 변수 패키지입니다.cpath에서 가져옵니다. 이 변수는 환경 변수 LUA 를 통해 가져옵니다.CPATH로 시작합니다.
검색 정책은 위와 같습니다. 단지 현재 검색하는 파일이 so나 dll 형식의 파일로 바뀌었을 뿐입니다.만약 찾을 수 있다면, 리퀴어는 패키지를 통과할 것이다.loadlib에서 불러옵니다.

C팩


루아와 C는 결합하기 쉬워서 C를 사용하여 루아를 위해 가방을 쓴다.
Lua의 쓰기 패키지와 달리 C 패키지는 사용하기 전에 반드시 먼저 불러오고 연결해야 한다. 대부분의 시스템에서 가장 쉬운 실현 방식은 동적 연결 라이브러리 메커니즘을 통해 연결하는 것이다.
Lua는loadlib이라는 함수에서 모든 동적 연결 기능을 제공합니다.이 함수는 두 가지 인자가 있습니다: 라이브러리의 절대 경로와 초기화 함수입니다.그래서 전형적인 호출의 예는 다음과 같다.
local path ="/usr/local/lua/lib/libluasocket.so"local f = loadlib(path,"luaopen_socket")

loadlib 함수는 지정한 라이브러리를 불러와서 Lua에 연결합니다. 그러나 라이브러리를 열지 않습니다. (즉 초기화 함수를 호출하지 않았다는 뜻입니다.) 반대로 초기화 함수를 Lua의 함수로 되돌려줍니다. 그러면 Lua에서 직접 호출할 수 있습니다.
동적 라이브러리를 불러오거나 초기화 함수를 찾을 때 오류가 발생하면loadlib은nil과 오류 정보를 되돌려줍니다.이전 코드를 수정하여 오류를 감지한 다음 초기화 함수를 호출할 수 있습니다.
local path ="/usr/local/lua/lib/libluasocket.so"--   path ="C:\\windows\\luasocket.dll"Window   local f =assert(loadlib(path,"luaopen_socket"))
f()--     

일반적인 상황에서 우리는 2진법의 발표 라이브러리에 앞의 코드 세그먼트와 비슷한 stub 파일을 포함하기를 희망한다. 2진법 라이브러리를 설치할 때 어떤 디렉터리에 아무렇게나 놓을 수 있다. stub 파일이 2진법 라이브러리에 대응하는 실제 경로를 수정하면 된다.
LUA에 stub 파일이 있는 디렉토리 추가PATH, 이렇게 설정하면 Require 함수를 사용하여 C 라이브러리를 불러올 수 있습니다.

좋은 웹페이지 즐겨찾기