《Programming in Lua》学习总结

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

  1. 赋值操作
    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]'

  2. 数组
    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 的数值类型键用于数组。

  3. 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中函数名对应起来了。

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

    将此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
    
    >


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值