之前写了一篇,居然误操作删除了,由于只保存了草稿,在百度上找不到快照,也找不到恢复的地方,只能再写一篇。这个误操作也是csdn不完善的地方,我本来想点【编辑】,错点到旁边的【删除】,于是我就按住鼠标不动,拖到其他地方,以为就不会触发删除了,结果这样做正好躲过了csdn的删除确认框,直接给删除了,当时我就惊呆了!不过幸好上一篇写了也就10来行,我就在重写一篇,正好lua没有看完,边看边复习了!

  1. 赋值操作
    Lua支持“一赋多值”,就在一个赋值语句中可以赋多个值。如:
a, b = 10, 2*x
  1. 而且由于Lua是先计算赋值语句右侧所有表达式的值,再进行赋值了,所以Lua可以利用这个特点,完成两个变量间的值交换。如:
x, y = y, x -- swap 'x' for 'y'
a[i], a[j] = a[j], a[i] -- swap 'a[i]' for 'a[j]'

  1. 数组
    Lua中用 table 数据结构实现数组功能。如:
myTable = { 5, 4, 3, 2, 1 }
myTable[ 1 ] -->5
myTable[ 2 ] -->4
myTable[ 3 ] -->3
myTable[ 4 ] -->2
myTable[ 5 ] -->1
  1. 通过在构造列表中,排列出所有元素,将 table 初始化成一个数组。
    唯一需要注意的是:Lua中数组的索引习惯性从1开始。也就是默认构造的数组,第一个元素的索引是1,不是0。
    数组的本质其实还是将 table 的数值类型键用于数组。
  2. C Module
    使用windows的dll可以实现Lua C Module,之后可以通过使用 require “libname" 加载该 C Module。使用其中的函数。
    需要注意两点:
  1. lua打开一个C Module 的时候会调用其中luaopen_xxx函数,所以 C Module 需要将这个函数导出,其他的函数就不用管了,地址已经记录在 C Module 的导出表里了。
  2. 包含lua SDK的文件的时候,使用 extern ”C" 括起来。因为lua5.1.lib,dll是C方式编译的,也就是函数名称没有被C++修饰过。所以为了在C++中能找到这个函数,需要通过extern “C" 来表示,这些函数不要用C++方式进行修饰,这样C++编译器就不会修饰这些函数名称了,就和lua.5.1.lib中函数名对应起来了。
  3. test_lua_lib.cpp
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;
}
  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

>