之前写了一篇,居然误操作删除了,由于只保存了草稿,在百度上找不到快照,也找不到恢复的地方,只能再写一篇。这个误操作也是csdn不完善的地方,我本来想点【编辑】,错点到旁边的【删除】,于是我就按住鼠标不动,拖到其他地方,以为就不会触发删除了,结果这样做正好躲过了csdn的删除确认框,直接给删除了,当时我就惊呆了!不过幸好上一篇写了也就10来行,我就在重写一篇,正好lua没有看完,边看边复习了!
- 赋值操作
Lua支持“一赋多值”,就在一个赋值语句中可以赋多个值。如:
a, b = 10, 2*x
而且由于Lua是先计算赋值语句右侧所有表达式的值,再进行赋值了,所以Lua可以利用这个特点,完成两个变量间的值交换。如:
x, y = y, x -- swap 'x' for 'y' a[i], a[j] = a[j], a[i] -- swap 'a[i]' for 'a[j]'
- 数组
Lua中用 table 数据结构实现数组功能。如:
myTable = { 5, 4, 3, 2, 1 } myTable[ 1 ] -->5 myTable[ 2 ] -->4 myTable[ 3 ] -->3 myTable[ 4 ] -->2 myTable[ 5 ] -->1
通过在构造列表中,排列出所有元素,将 table 初始化成一个数组。
唯一需要注意的是:Lua中数组的索引习惯性从1开始。也就是默认构造的数组,第一个元素的索引是1,不是0。
数组的本质其实还是将 table 的数值类型键用于数组。
- C Module
使用windows的dll可以实现Lua C Module,之后可以通过使用 require “libname" 加载该 C Module。使用其中的函数。
需要注意两点:
- lua打开一个C Module 的时候会调用其中luaopen_xxx函数,所以 C Module 需要将这个函数导出,其他的函数就不用管了,地址已经记录在 C Module 的导出表里了。
- 包含lua SDK的文件的时候,使用 extern ”C" 括起来。因为lua5.1.lib,dll是C方式编译的,也就是函数名称没有被C++修饰过。所以为了在C++中能找到这个函数,需要通过extern “C" 来表示,这些函数不要用C++方式进行修饰,这样C++编译器就不会修饰这些函数名称了,就和lua.5.1.lib中函数名对应起来了。
extern "C" { #include "lua.h" #include "lauxlib.h" #include "lualib.h" }; #pragma comment( lib, "lua51.lib" ) #include <string> int ConvertTableToString( lua_State* pLua ) { std::string strBuffer; lua_pushnil( pLua ); while( 0 != lua_next( pLua, 1 ) ) { const char* pszKey = lua_tostring( pLua, -2 ); const char* pszValue = lua_tostring( pLua, -1 ); if( pszKey && pszValue ) { strBuffer += pszKey; strBuffer += " = "; strBuffer += pszValue; strBuffer += "\n"; } lua_pop( pLua, 1 ); } lua_pushlstring( pLua, strBuffer.c_str(), strBuffer.length() ); return 1; } static luaL_Reg s_Functions[] = { { "ConvertTableToString", &ConvertTableToString }, { NULL, NULL }, }; extern "C" _declspec( dllexport ) int luaopen_test_lua_lib( lua_State* pLua ) { luaL_register( pLua, "CModule", s_Functions ); return 1; }
将此dll放入,Lua 5.1\clibs\ 目录下,然后打开lua.exe,在命令行中输入
cmd:
Lua 5.1.4 Copyright (C) 1994-2008 Lua.org, PUC-Rio > myTable = { x = 100, y = 200 } > require "test_lua_lib" > strTest = CModule.ConvertTableToString( myTable ) > =strTest y = 200 x = 100 >