学习材料:https://www.runoob.com/lua/lua-tutorial.html
开发环境:SciTE
学习目标:学会使用Lua语法,并在C++中调用
学习时长:预计两天掌握
Lua基本语法
- --单行注释,--[[ code ]]--
- 多行注释推荐使用 --[=[注释内容]=],这样可以避免遇到table[table[idx]]时就将多行注释结束’
Lua数据类型
数据类型 | 描述 |
---|---|
nil | 这个最简单,只有值nil属于该类,表示一个无效值(在条件表达式中相当于false)。 |
boolean | 包含两个值:false和true。 |
number | 表示双精度类型的实浮点数 |
string | 字符串由一对双引号或单引号来表示 |
function | 由 C 或 Lua 编写的函数 |
userdata | 表示任意存储在变量中的C数据结构 |
thread | 表示执行的独立线路,用于执行协同程序 |
table | Lua 中的表(table)其实是一个"关联数组"(associative arrays),数组的索引可以是数字、字符串或表类型。在 Lua 里,table 的创建是通过"构造表达式"来完成,最简单构造表达式是{},用来创建一个空表。 |
nil
- 一个未定义的变量,输出为nil
- 对于全局变量和table,nil可以起到删除的作用
tab1 = {key1 = "val1",key2 ="val2","val3"} for k,v in pairs(tab1) do print(k .. "-" .. v) end tab1.key1 =nil; for k,v in pairs(tab1) do print(k .. "-" .. v) end
-
变量类型与nil作比较需要这样写:print(type(x) =="nil")
boolean
- Lua中,nil和false都可以认为是假
number
- 平时看到的数字都是
string
- [[ ]]中间可以加很多行,并且输出会保留空格和回车
- print("2" + "6") 是8
- “a” .. "b" 可以得到"ab"
table
- table = vector + map ,并且下标从1开始
- table在求长度的时候要用泛型for循环,tb[1],tb[2],tb[4] #tb=2
function
- 当作函数指针用就好啦
thread
- 线程和协程的区别:线程可以同一时刻有多个在运行,而协程任意一个时刻只能有一个在运行
userdate
- 程序员自定义的结构体和指针(没实践过)
Lua变量
- 默认都是全局,除非用local指定是局部变量
- a,b=b,a (等价于swap(a,b))
- 应该尽可能使用局部变量,原因不用多说
Lua循环
for
- 数值FOR : for var =st,ed,delta
- 泛型FOR : for i,v in pairs(tableA) do print() end
Lua函数
- local function fuction_name(arg1,arg2,arg3) do ... end
- ...代表可变数组长度
function average(...) result = 0 local arg={...} for i,v in ipairs(arg) do result = result + v end print("总共传入 " .. select("#",...) .. " 个数") return result/select("#",...) end print("平均值为",average(10,5,3,4,5,6))
- 获取可变数组的总长度,第n个
-
do function foo(...) for i = 1, select('#', ...) do -->获取参数总数 local arg = select(i, ...); -->读取参数 print("arg", arg); end end foo(nil,nil); end
原表
- 简单的理解:对于一个表如果找不到要的数据,就找另一个表
VisualStudio中调用Lua
- C/C++:项目属性→常规→附加包含目录Include
- 链接器:常规→附加库目录lib文件夹
- 链接器:输入→附加依赖项lua5.1.lib lua51.lib
//用Lua编译器编译
extern "C" {
#include "lua.h"
#include "lauxlib.h"
#include "lualib.h"
}
#include <cstring>
int main()
{
lua_State* L = lua_open();
luaopen_base(L);
//luaL_loadfile(L, "C:/Users/76422/Desktop/testjob.lua");
char ch[256] = "print(996)";
luaL_loadbuffer(L, ch, strlen(ch), "haha");
lua_pcall(L, 0, 0, 0);
lua_close(L);
}
//获取Lua中的全局变量
extern "C" {
#include "lua.h"
#include "lauxlib.h"
#include "lualib.h"
}
#include <cstring>
#include<stdio.h>
int main()
{
lua_State* L = lua_open();
luaopen_base(L);
//luaL_loadfile(L, "C:/Users/76422/Desktop/testjob.lua");
//lua_pcall(L, 0, 0, 0);
luaL_dofile(L, "C:/Users/76422/Desktop/test.lua");
lua_getglobal(L, "a");
int a = lua_tonumber(L, -1);
printf("a=%d\n",a);
lua_close(L);
}
//执行Lua脚本中的函数
extern "C" {
#include "lua.h"
#include "lauxlib.h"
#include "lualib.h"
}
#include <cstring>
#include<stdio.h>
int main()
{
lua_State* L = lua_open();
luaopen_base(L);
//luaL_loadfile(L, "C:/Users/76422/Desktop/testjob.lua");
//lua_pcall(L, 0, 0, 0);
luaL_dofile(L, "C:/Users/76422/Desktop/test.lua");
lua_getglobal(L, "get");
lua_pushnumber(L,996);
lua_pcall(L,1,1,0);
int x = lua_tonumber(L, -1);
lua_close(L);
}
//获取Lua脚本中Table的某个内容,每次gettable会把table也清空,因此取完一次后,要再执行lua_getglobal(L, "window") 一次
extern "C" {
#include "lua.h"
#include "lauxlib.h"
#include "lualib.h"
}
#include <cstring>
#include<stdio.h>
int getValue(lua_State* L, const char* c) {
lua_getglobal(L, "window");
lua_pushstring(L, c);
lua_gettable(L, -2);
int res = lua_tonumber(L, -1);
lua_pop(L, -1);
printf("cnt = %d res = %d\n",lua_gettop(L),res);
return res;
}
int main()
{
lua_State* L = lua_open();
luaopen_base(L);
//luaL_loadfile(L, "C:/Users/76422/Desktop/testjob.lua");
//lua_pcall(L, 0, 0, 0);
luaL_dofile(L, "C:/Users/76422/Desktop/test.lua");
lua_settop(L, 0);
int wide = getValue(L, "wide");
int height = getValue(L,"hight");
lua_close(L);
}
C调用Lua(C)到此,基本上已经学会了如何使用,下一节是学习如果在Lua中调用C
在Lua中调用C
//
extern "C" {
#include "lua.h"
#include "lauxlib.h"
#include "lualib.h"
}
#include <cstring>
#include<stdio.h>
int getValue(lua_State* L, const char* c) {
lua_getglobal(L, "window");
lua_pushstring(L, c);
lua_gettable(L, -2);
int res = lua_tonumber(L, -1);
lua_pop(L, -1);
printf("cnt = %d res = %d\n",lua_gettop(L),res);
return res;
}
int main()
{
lua_State* L = lua_open();
luaopen_base(L);
//luaL_loadfile(L, "C:/Users/76422/Desktop/testjob.lua");
//lua_pcall(L, 0, 0, 0);
int x = 30;
lua_pushnumber(L, x);
lua_setglobal(L, "x");
luaL_dofile(L, "C:/Users/76422/Desktop/test.lua");
//lua_settop(L, 0);
//int wide = getValue(L, "wide");
//int height = getValue(L,"hight");
lua_close(L);
}
extern "C" {
#include "lua.h"
#include "lauxlib.h"
#include "lualib.h"
}
#include <cstring>
#include<stdio.h>
int getValue(lua_State* L, const char* c) {
lua_getglobal(L, "window");
lua_pushstring(L, c);
lua_gettable(L, -2);
int res = lua_tonumber(L, -1);
lua_pop(L, -1);
printf("cnt = %d res = %d\n",lua_gettop(L),res);
return res;
}
//table全局变量
int main()
{
lua_State* L = lua_open();
luaopen_base(L);
//luaL_loadfile(L, "C:/Users/76422/Desktop/testjob.lua");
//lua_pcall(L, 0, 0, 0);
lua_settop(L, 0);
int wide = 22333;
int height = 2;
lua_newtable(L);
lua_pushstring(L, "width");
lua_pushnumber(L, wide);
lua_settable(L, -3);
printf("cnt = %d \n", lua_gettop(L));
lua_pushstring(L, "height");
lua_pushnumber(L, height);
lua_settable(L, -3);
printf("222cnt = %d \n", lua_gettop(L));
lua_setglobal(L,"t1");
luaL_dofile(L, "C:/Users/76422/Desktop/test.lua");
//int wide = getValue(L, "wide");
//int height = getValue(L,"hight");
lua_close(L);
}
//Lua调用C++函数
extern "C" {
#include "lua.h"
#include "lauxlib.h"
#include "lualib.h"
}
#include <cstring>
#include<stdio.h>
int wide = 996;
int getValue(lua_State* L) {
lua_pushnumber(L, wide);
lua_pushnumber(L, 88);
return 2;
}
int main()
{
lua_State* L = lua_open();
luaopen_base(L);
//luaL_loadfile(L, "C:/Users/76422/Desktop/testjob.lua");
//lua_pcall(L, 0, 0, 0);
lua_settop(L, 0);
lua_pushcfunction(L, getValue);
lua_setglobal(L,"eee");
luaL_dofile(L, "C:/Users/76422/Desktop/test.lua");
//int wide = getValue(L, "wide");
//int height = getValue(L,"hight");
lua_close(L);
}
//只会传一个,传2个有问题,问题暂留
extern "C" {
#include "lua.h"
#include "lauxlib.h"
#include "lualib.h"
}
#include <cstring>
#include<stdio.h>
int wide = 996;
int getValue(lua_State* L) {
int sz = lua_tonumber(L, -1);
lua_pop(L,-1);
lua_pushnumber(L, wide *sz);
lua_pushnumber(L, 88 *sz);
return 2;
}
int main()
{
lua_State* L = lua_open();
luaopen_base(L);
//luaL_loadfile(L, "C:/Users/76422/Desktop/testjob.lua");
//lua_pcall(L, 0, 0, 0);
lua_settop(L, 0);
lua_pushcfunction(L, getValue);
lua_setglobal(L,"eee");
luaL_dofile(L, "C:/Users/76422/Desktop/test.lua");
//int wide = getValue(L, "wide");
//int height = getValue(L,"hight");
lua_close(L);
}