Lua脚本编程基础

一. 数据类型

①基本类型

1. nil类型

2. boolean类型

3. numbers类型

4. string类型

②高级类型

1. table类型

2. function类型

3. userdata类型

4. thread类型

 二 . 脚本示例

-- 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++的互操作

// 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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值