一. 数据类型
①基本类型
1. nil类型
2. boolean类型
3. numbers类型
4. string类型
②高级类型
1. table类型
2. function类型
3. userdata类型
4. thread类型
二 . 脚本示例文章来源:https://www.toymoban.com/news/detail-528887.html
-- main.lua
print("hello lua")
-- lua的四种基本数据类型:nil,boolean,numbers,string
-- 全局变量,可以直接在其他脚本文件中访问。慎用
-- 该变量为数字类型,数字类型是以double类型存储的
print("initialize g_var="..g_var)
g_var = 10
dofile("test.lua")
-- 局部变量,离开作用域会自动释放
-- 该变量为nil类型
-- 将全局变量设为nil,则该变量将会被lua回收。因此申请了全局变量,在不用的时候
-- 需要设为nil,进行资源释放
local b=nil
print(type(b))
-- bool类型变量
local c = true
print(type(c))
-- 字符串类型
local html = [[<html>
<body>hello html</body>
</html>]]
print(type(html))
-- ..用于字符串拼接
html = "<header info>" .. html .. "</header info>"
print(html)
print("html length=" .. string.len(html))
print("sub string = ".. string.sub(html,1,5))
-- 字符串查找,支持正则匹配
local bb,ee = string.find(html,"body");
print("find string = ".. string.sub(html,bb,ee))
-- 字符串替换,支持正则匹配
local re = string.gsub(html,"body","Body")
print("replace result ="..re)
-- lua 的高级数据类型
local tab1 = {"001","002","003"}
tab2 = {id=123,age=20,name="Tom"};
tab2["country"] = "china"
print("======= Table1=======")
for i,v in ipairs(tab1) do
print("key="..i..", value="..v)
end
print("======= insert to certain position =======")
table.insert(tab1,3,"002-2")
for i,v in ipairs(tab1) do
print("key="..i..", value="..v)
end
print("======= remove certain element =======")
table.remove(tab1,3)
for i,v in ipairs(tab1) do
print("key="..i..", value="..v)
end
print("======= Table2=======")
for i,v in pairs(tab2) do
print("key="..i..", value="..v)
end
tab2["id"]=nil
print("======= remove certain element =======")
for i,v in pairs(tab2) do
print("key="..i..", value="..v)
end
-- test.lua
print(g_var)
local b = tonumber("1000")
print(b*g_var)
-- functions.lua
function callback(info,param)
print("in callback function:"..info)
print("key="..param.key1)
return {status=true,msg=info}
-- return true,info
end
function test(...)
local argCnt=table.getn(arg)
print("arg count is "..argCnt)
for i=1,argCnt do
print("arg"..i.."="..type(arg[i]))
if(type(arg[i]) == "function") then
arg[i]("test function",{key1="p1",key2="p2"})
end
end
end
local lambdalua=function(para1,para2)
print("para1="..para1..",para2="..para2)
end
-- test(123,"hello",callback)
-- lambdalua("hello","lua")
三. lua与c/c++的互操作文章来源地址https://www.toymoban.com/news/detail-528887.html
// CppLua.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <iostream>
#include<thread>
extern "C" {
#include <lua.h>
#include <lauxlib.h>
#include <lualib.h>
}
int main()
{
std::cout << "lua begin" << std::endl;
lua_State* L = lua_open();
luaopen_base(L);
luaopen_string(L);
luaopen_table(L);
if (luaL_loadfile(L, "functions.lua") != 0)
{
const char* error = lua_tostring(L,-1);
printf("lua load error: %s",error);
return -1;
}
//在脚本运行前,设一些初始值给lua脚本
lua_pushinteger(L, 100);
lua_setglobal(L,"g_var");//会自行pop栈顶元素
lua_pcall(L,0,0,0);
// std::this_thread::sleep_for(std::chrono::milliseconds(1000));
lua_getglobal(L,"g_var");//会向栈顶压栈g_var的值
int gv = lua_tonumber(L,-1);
lua_pop(L, 1);//出栈一个元素,恢复栈
printf("lua global varable=%d\n",gv);
//lua_getglobal(L,"tab2");
//lua_getfield(L,-1,"age");
//printf("tab2: age=%f\n",lua_tonumber(L,-1));
//lua_pop(L, 1);
// lua_getfield(L, -1, "country");
//printf("tab2: country=%s\n", lua_tostring(L, -1));
//lua_pop(L,1);
printf("before call, stack top is =%d\n", lua_gettop(L));
lua_getglobal(L, "callback");
lua_pushstring(L,"C++ call info");
lua_newtable(L);
lua_pushstring(L,"key1");
lua_pushnumber(L,double(1));
lua_settable(L,-3);
if (lua_pcall(L, 2, 1, 0) != 0)//步骤1. 出栈所有参数;步骤2.运行栈顶的可调用对象,并出栈;步骤3.将返回值或者错误码压栈
{
const char* error = lua_tostring(L, -1);
printf("callback error: %s", error);
return -1;
}
else
{
/* return more than one result*/
//printf("res1=%s\n", lua_tostring(L, -1));
//lua_pop(L, 1);
// printf("res2=%d\n", lua_toboolean(L, -1));
// lua_pop(L,1);
/*return a table*/
lua_getfield(L,-1,"status");
printf("callback result code=%d\n", lua_toboolean(L, -1));
lua_pop(L, 1);
lua_getfield(L, -1, "msg");
printf("callback result code=%s\n", lua_tostring(L, -1));
lua_pop(L, 2);
}
printf("after call, stack top is =%d\n", lua_gettop(L));
lua_close(L);
std::cout << "lua end" << std::endl;
return 0;
}
到了这里,关于Lua脚本编程基础的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!