Lua 모듈 및 패키지
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 라이브러리를 불러올 수 있습니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Neovim을 위한 자동 완성NeoVim으로 생산성을 높일 수 있는 가장 멋진 기능 중 하나는 자동 완성이므로 성능에 따라 플러그인을 선택할 수 있습니다. YouCompleteMe Coc.nvim 이 플러그인은 사용하기 좋지만 Javascrip...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.