Latest web development tutorials

루아 모듈 패키지

모듈 루아 5.1부터 라이브러리 패키지 유사 루아하면 코드를 재사용하는 대신, 다른 장소에있는 API 인터페이스 호출의 형태에서, 하나의 파일의 일부 공통 코드 넣고 줄일 수있는 표준 모듈 관리 메커니즘을 추가 코드 커플 링.

루아 모듈은 따라서 매우 간단한 모듈을 만들고, 변수, 함수 및 다른 알려진 요소에서 테이블, 다음, 상수를 내보낼 필요가 테이블을 만드는 것입니다, 기능되는, 마지막 행에서 테이블로 돌아왔다. 다음과 같이 다음은 사용자 정의 모듈 module.lua를 생성하고, 파일의 코드 형식은 다음과 같습니다

-- 文件名为 module.lua
-- 定义一个名为 module 的模块
module = {}
 
-- 定义一个常量
module.constant = "这是一个常量"
 
-- 定义一个函数
function module.func1()
    io.write("这是一个公有函数!\n")
end
 
local function func2()
    print("这是一个私有函数!")
end
 
function module.func3()
    func2()
end
 
return module

만약 호출 모듈 또는 함수 상수로 작동 할 수있는 가동 요소로 테이블을 호출 할 수 있도록 상기에서, 모듈의 구성은, 테이블 구조이다.

따라서 개인 기능을 의미하고, 지역 변수는 블록으로 선언 위의 FUNC2는 모듈 공용 함수를 호출해야합니다 민간 기능 모듈 외부에서 액세스 할 수 없습니다.


기능을 필요로

루아는 모듈을로드하는 데 사용됩니다 필요라는 기능을 제공합니다. 모듈을로드하려면 호출. 예를 들면 :

require("<模块名>")

또는

require "<模块名>"

실행 후 반환하는 테이블로 구성되는 모듈에 의해 일정하거나 기능을 요구하고, 테이블을 포함하는 전역 변수를 정의 할 것이다.

-- test_module.lua 文件
-- module 模块为上文提到到 module.lua
require("module")
 
print(module.constant)
 
module.func3()

상기 코드의 결과로서 실행된다 :

这是一个常量
这是一个私有函数!

또는 모듈 별명 변수, 쉽게 전화를 정의로드 :

-- test_module2.lua 文件
-- module 模块为上文提到到 module.lua
-- 别名变量 m
local m = require("module")
 
print(m.constant)
 
m.func3()

상기 코드의 결과로서 실행된다 :

这是一个常量
这是一个私有函数!

로딩 메커니즘

파일 디렉토리 할 것 없습니다하는 사용자 정의 모듈의 경우, 루아 나 C 프로그램 라이브러리 모듈 파일을로드하려고, 함수가 자신의 파일 경로 로딩 전략이 필요합니다.

루아 파일의 검색 경로는 루아 부팅 후, 환경 변수의 LUA_PATH 초기 값 환경 변수, 전역 변수 package.path에 저장해야합니다. 당신이 환경 변수를 찾을 수없는 경우, 기본 경로는 컴파일 타임 초기화에 의해 정의.

더 LUA_PATH이 환경 변수가없는 경우는 물론, 당신은 또한 (가, 작성하지 않습니다 당신은 또한의 .bashrc 파일을 열 수 있습니다), 예를 들어, "~ / 루아 /"경로 LUA_PATH 환경에 가입하려면 현재 사용자의 홈 디렉토리의 .profile 파일에서 열려, 설정을 사용자 정의 할 수 있습니다 변수 :

#LUA_PATH
export LUA_PATH="~/lua/?.lua;;"

파일 경로 ";"마지막 두 개의 ";"로 구분하여 새로 추가 된 플러스 기본 경로의 원래 경로를 의미합니다.

다음, 즉시 적용 할 환경 변수의 매개 변수를 업데이트합니다.

source ~/.profile

그런 다음 package.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

호출 할 때 그래서 목표를 검색하려면 다음과 같은 파일 디렉토리를 열려고합니다 ( "모듈")가 필요합니다.

/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

접근하는 경우 대상 파일은 모듈을로드 할 수 package.loadfile를 호출됩니다. 그렇지 않으면, C 라이브러리로 이동합니다.

파일 검색 경로는 전역 변수에서 얻은 package.cpath이며,이 변수는 초기 환경 변수에 LUA_CPATH입니다.

검색 위와 같은과 전략,하지만 지금은 검색이 때문에 교체 또는 DLL 파일 유형입니다. 당신이 그것을 찾을 수 있다면, 그것을로드 package.loadlib가 필요합니다.


C 패키지

루아와 C는 쉽게 루아 패키지를 작성하는 C를 사용하여 결합된다.

다른 패키지와 루아를 작성, 사용하기 전에 C 패키지가 처음로드와 연결되어 있어야합니다, 대부분의 시스템에서 동적 링크 라이브러리 메커니즘을 달성 할 수있는 가장 쉬운 방법입니다.

루아는 함수 호출 LOADLIB에서 동적 링크의 모든 기능을 제공합니다. 라이브러리 및 초기화 기능에 대한 절대 경로 :이 함수는 두 개의 인수를 사용합니다. 그래서 일반적인 통화의 예입니다 :

local path = "/usr/local/lua/lib/libluasocket.so"
local f = loadlib(path, "luaopen_socket")

LOADLIB 함수는 루아에 지정된 라이브러리와 연결을로드하지만, (즉, 어떤 통화 초기화 함수) 라이브러리를 열 수 없습니다 우리는 루아에서 직접 그에게 전화 할 수 있도록, 그렇지 않으면 그는 루아 함수로 초기화 함수를 반환합니다.

동적 라이브러리 또는 초기화 기능 검색을로드하는 동안 오류가 발생한 경우, LOADLIB은 전무 및 오류 메시지를 반환합니다. 우리는 오류를 감지 한 후 초기화 함수를 호출하는 코드의 이전 섹션을 수정할 수 있습니다 :

local path = "/usr/local/lua/lib/libluasocket.so"
-- 或者 path = "C:\\windows\\luasocket.dll",这是 Window 平台下
local f = assert(loadlib(path, "luaopen_socket"))
f()  -- 真正打开库

정상적인 상황에서는 우리가 설치 바이너리 쉽게 디렉토리에 배치 할 수 있습니다, 이진 라이브러리의 출시 이전 코드와 유사 스텁 파일이 들어있는 기대, 당신은 단지 바이너리 라이브러리 스텁 파일이 실제 경로에 해당하는 수정해야합니다.

파일이 스텁 LUA_PATH에 추가 된 디렉토리는이 설정 기능이 필요한 C 라이브러리를로드 한 후 사용할 수 있습니다.