精华内容
下载资源
问答
  • Lua入门相关10Lua入门相关10Lua入门相关10Lua入门相关10Lua入门相关10Lua入门相关10Lua入门相关10
  • Lua入门

    2014-02-18 15:19:11
    Lua入门 Lua是一个被设计成用于扩展C/C++编程的轻量级脚本语言。不幸的是,网上很少有关于这个语言的在线教程。我主要通过阅读其源代码来了解它是怎样工作并且通过一些发布的程序学习它。希望,通过下面的教程,...
    
    
    Lua入门
    Lua是一个被设计成用于扩展C/C++编程的轻量级脚本语言。不幸的是,网上很少有关于这个语言的在线教程。我主要通过阅读其源代码来了解它是怎样工作并且通过一些发布的程序学习它。希望,通过下面的教程,会让学习Lua更加简单。

    本教程涵盖了Lua5.1。在Lua的每一个版本中都有一些非常不同之处。下面的示例代码将不能在老版本的Lua下运行。如果你仍然在使用老版本而且不愿意升级,不用担心,我已经在文章底部提供了4.0和5.0教程的源代码下载连接。好了,让我们开始吧!

    首先,你需要下载Lua。你需要从Lua下载页面去下载源代码。如果你需要编译好了的二进制库,你能在LuaBinaries 中找到你想要的库(lib or dll)。

    现在,我们需要安装Lua。在Linux下,你应该先解压文件,然后以root用户在命令行键入"make linux"和"make linux install"。如果你需要帮助,请参考源代码文件夹中的INSTALL文件。现在,我下载了windows平台下的二进制库包并把它们解压到"C:/Program Files/lua5.1"。

    在Linux下不需要我们做任何设置,但是在windows平台下我们必须配置Visual C++,以便让编译器和连接器找到Lua文件。

    1. 打开Visual C++,选择Tools菜单中的选项菜单。
    2. 展开"项目",并选择"VC++ 目录"。
    3. 选择"包含文件",添加一个新路径"C:/Program Files/lua5.1/include"。
    4. 在选择"库文家",添加路径"C:/Program Files/lua5.1/lib/dll"(这里假设你下载的库为dll,你也可以下载静态链接库)。
    5. 确定。 

    现在你可以开始编译你的第一个Lua应用了。

    使用Lua开始你的第一个程序

    这个程序简短且直接,下面做一点说明:

    1. lua_open()返回一个指向Lua解释器的一个指针。
    2. luaL_openlibs()用于装载Lua库,它提供了一些简单的函数,如:print。
    3. 通过调用luaL_dofile()执行脚本。它的作用是读取并解释脚本。
    4. 最后,通过lua_close()函数关闭Lua。

    保存文件为luatest.cpp。如果你直接使用C而不是C++,将文件名改为luatest.c,然后将extern "C"删除。

    #include <stdio.h>
    
    
    extern "C" {
    
    	#include "lua.h"
    
    	#include "lualib.h"
    
    	#include "lauxlib.h"
    
    }
    
    
    /* Lua解释器指针 */
    
    lua_State* L;
    
    
    int main ( int argc, char *argv[] )
    
    {
    
    	/* 初始化Lua */
    
    	L = lua_open();
    
    
    	/* 载入Lua基本库 */
    
    	luaL_openlibs(L);
    
    
    	/* 运行脚本 */
    
    	luaL_dofile(L, "test.lua");
    
    
    	/* 清除Lua */
    
    	lua_close(L);
    
    
    	/* 暂停 */
    
    	printf( "Press enter to exit…" );
    
    	getchar();
    
    
    	return 0;
    
    }
    
    

    下面是test.lua的内容。

    -- simple test
    
    
    print "Hello, World!"
    

    编译

    在Linux下,在命令行键入:

    g++ luatest.cpp -llua -ldl -o luatest

    然后,键入下列命令运行:

    ./luatest

    如果没有问题,程序将在终端输出Hello, World!

    在Visual C++你将需要进行下列步骤:

    1. 创建一个新的空Win32控制台应用工程。
    2. 将"luatest.cpp"加入你的工程。
    3. 选择项目菜单中的属性菜单。
    4. 在"连接器"的"输入"栏目的"附加依赖项"中输入"lua5.1.lib"。
    5. 确定。

    此时,按F7构建程序。

    如果你采用的是dll库,请确保将其放在应用程序的目录中或者windows系统能够找到它的地方。如果你采用的是静态连接库,则不需要。

     (本文由Groov0V翻译,转载请指明出处!)

    展开全文
  • Lua 入门

    2021-02-17 11:14:14
    Lua 官网Lua Builds 1、Windows安装 Lua 把下载下来的lua-5.4.2_Win64_bin.zip文件解压缩到D:\lua目录 2、设置环境变量 3、运行cmd,查看Lua版本 4、Hello world 双击【D:\lua\lua.exe】,输入【print("Hello World...

    Lua 官网
    Lua Builds

    1、Windows 安装 Lua

    把下载下来的lua-5.4.2_Win64_bin.zip文件解压缩到D:\lua目录
    2、设置环境变量

    3、运行cmd,查看Lua版本

    4、Hello world
    双击【D:\lua\lua.exe】,输入【print("Hello World!")】

    5、执行lua文件
    在D盘根目录创建一个【test.lua】文件【D:\test.lua】,文件内容是【print("Hello World!")】

    6、运行cmd,导航到D盘根目录,执行命令【luac test.lua】,D盘根目录会生成一个【luac.out】文件,这是源文件编译好了

    7、执行命令【lua luac.out】,成功输出【Hello Word!】

    8、ASP.NET Core
    管理 NuGet 程序包
    MoonSharp
    *
    *
    *
    *
    *
    *
    *

    展开全文
  • lua入门

    千次阅读 2019-02-04 23:40:52
    redis2.6以后可以在redis 中使用lua语言。 1、用lua的好处: 1)一个脚本包含多个操作,减少访问次数从而减少网络开销 2)原子操作 redis 对lua脚本是原子化执行方案 3)复用性 复用 lua脚本的逻辑 2、lua脚本...

    redis2.6以后可以在redis 中使用lua语言。
    1、用lua的好处:
    1)一个脚本包含多个操作,减少访问次数从而减少网络开销
    2)原子操作 redis 对lua脚本是原子化执行方案
    3)复用性 复用 lua脚本的逻辑
    2、lua脚本安装:
    1)下载安装包 并解压

     tar-zvxf lua-5.3.5.tar.gz
    

    2)执行 make linux 编译
    编译过程报错 lua.c:82:31: 致命错误:readline/readline.h:没有那个文件或目录
    百度一下得知,需要安装依赖
    执行 如下命令安装依赖:

    yum install libtermcap-devel ncurses-devel libevent-devel readline-devel
    
    

    重新解压编译

    [root@192 lua-5.3.5]# make linux test
    cd src && make linux
    make[1]: 进入目录“/usr/apps/lua/lua-5.3.5/src”
    make all SYSCFLAGS="-DLUA_USE_LINUX" SYSLIBS="-Wl,-E -ldl -lreadline"
    make[2]: 进入目录“/usr/apps/lua/lua-5.3.5/src”
    gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_2 -DLUA_USE_LINUX    -c -o lapi.o lapi.c
    gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_2 -DLUA_USE_LINUX    -c -o lcode.o lcode.c
    

    然后 运行 lua 就启动进入了 lua 如下:

    [root@192 ~]# lua
    Lua 5.1.4  Copyright (C) 1994-2008 Lua.org, PUC-Rio
    > 
    

    3、初步使用
    lua特点 动态类型的语言,和js类似
    变量 分为 全局变量 和局部变量

    单行注释 –
    多行注释 --[[ ]]

    全局变量 a=1
    局部变量 local b=1
    逻辑表达式 ±*/
    测试代码如下 编辑脚本 luatest :
    vi testlua 输入内容 (lua testlua 执行脚本)

    a=1
    local b=2
    print(a+b)
    

    执行 lua luatest 结果
    在这里插入图片描述

    关系运算符
    a==b 比较两个值是否相等
    ~= 比较两个值是否不等

    a=1
    local b=2
    --print(a+b)
    print (a==b)
    print (a~=b)
    print(a=='1')
    

    执行 lua luatest 结果
    在这里插入图片描述

    逻辑运算符
    and
    or
    not

    测试脚本:

    true
    false
    [root@192 lua-5.3.5]# vi luatest
    print((a==b)and(a==1
    a=1
    local b=2
    --[[print(a+b)
    print (a==b)
    print (a~=b)
    print(a=='1')
    ]]
    print((a==b)and(a==1) )
    print((a==b)or(a==1) )
    print(not(a==b))
    

    执行 lua luatest 结果
    在这里插入图片描述

    字符串 操作
    … 拼接 a…b 拼接字符串 a和b 同 java 的a+b
    #计算字符串的长度 #a 字符串a 的长度
    测试代码

    str1='hello'
    str2='world'
    print(str1..str2)
    print(#str1)
    

    在这里插入图片描述

    条件判断 如下
    a=1
    if( a == 1) then
    print(‘a=1’)
    elseif( b == 2) then
    print(‘b=2’)
    else
    print(‘111’)
    end

    执行结果:
    a=1

    循环
    a=1
    while(a<10) do
    print(a)
    a=a+1
    end
    测试结果:
    在这里插入图片描述

    for i=1,5 do
    print(i)
    end
    测试
    在这里插入图片描述

    遍历数组

    local arr={‘a’,‘b’,‘c’}
    for i,v in ipairs(arr) do
    print(i…’=’…v)
    end
    [root@192 lua-5.3.5]# lua luatest
    1=a
    2=b
    3=c
    [root@192 lua-5.3.5]#

    测试结果如下

    local function add(a,b)
    return a+b;
    end
    print(add(1,2))
    "luatest" 46L, 474C written
    [root@192 lua-5.3.5]# lua luatest 
    3
    

    其他内置操作:Sting 操作字符串 Table 操作数组

    4、redis 整合 lua

    lua 提供了redis 的操作 如:redis.call(‘set‘,‘name’,‘zhang’)
    但是直接运行该段脚本提示错误 如下

    > redis.call('set','name','zhang');
    stdin:1: attempt to index global 'redis' (a nil value)
    stack traceback:
            stdin:1: in main chunk 
            [C]:
    

    原因是直接在lua环境中运行该脚本,没有依赖的redis引擎。所以报错。
    因为redis中提供了这个引擎,所以在redis中运行该段脚本就没有这个问题了。
    在redis-cli 中运行该段脚本的方式: eval “脚本” keynumbers key… arg…[参数(没有参数写0)]
    如下:

    127.0.0.1:6379> eval "redis.call('set','name','zhang')" 0
    (nil)
    127.0.0.1:6379> get name
    "zhang"
    127.0.0.1:6379> 
    

    有参数的测试:
    通过 1(传入几个键) ‘name’ ‘lisi’ 出入参数
    在脚本中 通过KEYS[1] 和 ARGV[1] 获取使用参数如下(下标从1开始):

    127.0.0.1:6379> eval "return redis.call('set',KEYS[1],ARGV[1])" 1 'name' 'lisi'
    OK
    127.0.0.1:6379> get name
    "lisi"
    

    5、lua实现访问ip频率限制
    编写脚本

    local num = redis.call('incr',KEYS[1])
    if (tonumber(num)==1) then
        redis.call('expire',KEYS[1],ARGV[1])
        return 1
    elseif (tonumber(num)>tonumber(ARGV[2])) then
        return 0
    else
        return 1
    end
    

    然后执行脚本 10秒内 第11次返回为0 10秒后返回为1

    [root@192 bin]# ./redis-cli --eval "iplimitlua.lua" ip1 , 10 , 10
    (integer) 1
    [root@192 bin]# ./redis-cli --eval "iplimitlua.lua" ip1 , 10  10
    (integer) 1
    [root@192 bin]# ./redis-cli --eval "iplimitlua.lua" ip1 , 10  10
    (integer) 1
    [root@192 bin]# ./redis-cli --eval "iplimitlua.lua" ip1 , 10  10
    (integer) 1
    [root@192 bin]# ./redis-cli --eval "iplimitlua.lua" ip1 , 10  10
    (integer) 1
    [root@192 bin]# ./redis-cli --eval "iplimitlua.lua" ip1 , 10  10
    (integer) 1
    [root@192 bin]# ./redis-cli --eval "iplimitlua.lua" ip1 , 10  10
    (integer) 1
    [root@192 bin]# ./redis-cli --eval "iplimitlua.lua" ip1 , 10  10
    (integer) 1
    [root@192 bin]# ./redis-cli --eval "iplimitlua.lua" ip1 , 10  10
    (integer) 1
    [root@192 bin]# ./redis-cli --eval "iplimitlua.lua" ip1 , 10  10
    (integer) 1
    [root@192 bin]# ./redis-cli --eval "iplimitlua.lua" ip1 , 10  10
    (integer) 1
    [root@192 bin]# ./redis-cli --eval "iplimitlua.lua" ip1 , 10  10
    (integer) 0
    
    

    遇到的问题:
    执行lua脚本时 要 ./redis-cli --eval “iplimitlua.lua” ip1 , 10 10 这样来执行 (ip1 为ip地址key ,10 10 表示 10 秒内访问不能大于10次 并且逗号前后要有空格)
    而不能 先执行 ./redis-cli
    然后执行 -eval “iplimitlua.lua” ip1 , 10 10 这样会报错

    6、lua脚本原子性验证
    一个redis-cli 中执行一个死循环 如下:

    [root@192 bin]# ./redis-cli
    127.0.0.1:6379> eval "while true do print(1) end" 0
    

    另一个客户端也链接 redis 执行redis操作 提示 redis is buzy .不能执行任何操作。

    [root@192 bin]# ./redis-cli
    127.0.0.1:6379> get name
    (error) BUSY Redis is busy running a script. You can only call SCRIPT KILL or SHUTDOWN NOSAVE.
    

    只有杀死redis服务重启后才能正常访问redis

    7、jedis 执行lua脚本
    两种方式 一种是直接执行脚本
    一种是 将脚本缓存在服务端,以摘要的方式执行,避免每次都传递完整脚本到服务端。具体脚本如下:

    
    
    public class TestLUA {
    	public static String lua="local num = redis.call('incr',KEYS[1]) "+
    							"if (tonumber(num)==1) then "+
    							"    redis.call('expire',KEYS[1],ARGV[1]) "+
    							"    return 1 "+
    							"elseif (tonumber(num)>tonumber(ARGV[2])) then "+
    							"    return 0 "+
    							"else "+
    							"    return 1 "+ 
    							"end";
    	public static String sha =null;
    	public static String loadScript() throws Exception{
    		//
    		Jedis jedis=RedisManager.getJedis();
    		//将脚本缓存到服务端并返回摘要信息
    		String sha = jedis.scriptLoad(lua);
    		System.out.println("sha===>"+sha);
    		return sha;
    	}
    	
    	public static Object testLua1() throws Exception{
    		if(null==sha){
    			System.out.println("加载脚本");
    			sha=loadScript();
    		}
    		
    		Jedis jedis=RedisManager.getJedis();
    		//String sha = jedis.scriptLoad(lua);
    		List<String> keys = new ArrayList<String>();
    		keys.add("ip:limit:127.0.0.1");
    		
    		List<String> args = new ArrayList<String>();
    		args.add("30");
    		args.add("10");
    		//以摘要方式执行脚本
    		return jedis.eval(sha, keys, args); 
    		
    	}
    	
    	public static Object testLua2() throws Exception{
    		
    		Jedis jedis=RedisManager.getJedis();
    		List<String> keys = new ArrayList<String>();
    		keys.add("ip:limit:127.0.0.1");
    		
    		List<String> args = new ArrayList<String>();
    		args.add("30");
    		args.add("10");
    		
    		return jedis.eval(lua, keys, args); //这样每次都传递脚本到服务端增加网络消耗
    		
    	}
    	
    	public static void main(String[] args) throws Exception {
    		for(int i=0;i<13;i++){
    			System.out.println(testLua1());
    			//System.out.println(testLua2());
    
    		}
    		
    	}
    
    }
    
    
    展开全文
  • Lua入门

    2009-07-20 14:15:00
    翻译自http://gamedevgeek.com/tutorials/getting-started-with-lua/Lua入门 Lua是一个被设计成用于扩展C/C++编程的轻量级脚本语言。不幸的是,网上很少有关于这个语言的在线教程。我主要通过阅读其源代码来了解它是...

     翻译自http://gamedevgeek.com/tutorials/getting-started-with-lua/
    Lua入门
    Lua是一个被设计成用于扩展C/C++编程的轻量级脚本语言。不幸的是,网上很少有关于这个语言的在线教程。我主要通过阅读其源代码来了解它是怎样工作并且通过一些发布的程序学习它。希望,通过下面的教程,会让学习Lua更加简单。
    本教程涵盖了Lua5.1。在Lua的每一个版本中都有一些非常不同之处。下面的示例代码将不能在老版本的Lua下运行。如果你仍然在使用老版本而且不愿意升级,不用担心,我已经在文章底部提供了4.0和5.0教程的源代码下载连接。好了,让我们开始吧!

    首先,你需要下载Lua。你需要从Lua下载页面去下载源代码。如果你需要编译好了的二进制库,你能在LuaBinaries 中找到你想要的库(lib or dll)。

    现在,我们需要安装Lua。在Linux下,你应该先解压文件,然后以root用户在命令行键入"make linux"和"make linux install"。如果你需要帮助,请参考源代码文件夹中的INSTALL文件。现在,我下载了windows平台下的二进制库包并把它们解压到"C:/Program Files/lua5.1"。

    在Linux下不需要我们做任何设置,但是在windows平台下我们必须配置Visual C++,以便让编译器和连接器找到Lua文件。

    打开Visual C++,选择Tools菜单中的选项菜单。
    展开"项目",并选择"VC++ 目录"。
    选择"包含文件",添加一个新路径"C:/Program Files/lua5.1/include"。
    在选择"库文家",添加路径"C:/Program Files/lua5.1/lib/dll"(这里假设你下载的库为dll,你也可以下载静态链接库)。
    确定。 
    现在你可以开始编译你的第一个Lua应用了。

    使用Lua开始你的第一个程序
    这个程序简短且直接,下面做一点说明:

    lua_open()返回一个指向Lua解释器的一个指针。
    luaL_openlibs()用于装载Lua库,它提供了一些简单的函数,如:print。
    通过调用luaL_dofile()执行脚本。它的作用是读取并解释脚本。
    最后,通过lua_close()函数关闭Lua。
    保存文件为luatest.cpp。如果你直接使用C而不是C++,将文件名改为luatest.c,然后将extern "C"删除。

    #include <stdio.h>

    extern "C" {
     #include "lua.h"
     #include "lualib.h"
     #include "lauxlib.h"
    }

    /* Lua解释器指针 */
    lua_State* L;

    int main ( int argc, char *argv[] )
    {
     /* 初始化Lua */
     L = lua_open();

     /* 载入Lua基本库 */
     luaL_openlibs(L);

     /* 运行脚本 */
     luaL_dofile(L, "test.lua");

     /* 清除Lua */
     lua_close(L);

     /* 暂停 */
     printf( "Press enter to exit…" );
     getchar();

     return 0;
    }
    下面是test.lua的内容。

    -- simple test

    print "Hello, World!"
    编译
    在Linux下,在命令行键入:

    g++ luatest.cpp -llua -ldl -o luatest然后,键入下列命令运行:

    ./luatest如果没有问题,程序将在终端输出Hello, World!

    在Visual C++你将需要进行下列步骤:

    创建一个新的空Win32控制台应用工程。
    将"luatest.cpp"加入你的工程。
    选择项目菜单中的属性菜单。
    在"连接器"的"输入"栏目的"附加依赖项"中输入"lua5.1.lib"。
    确定。
    此时,按F7构建程序。

    如果你采用的是dll库,请确保将其放在应用程序的目录中或者windows系统能够找到它的地方。如果你采用的是静态连接库,则不需要。

     (本文由Groov0V翻译,转载请指明出处!)


    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/Lodger007/archive/2006/06/26/836466.aspx

    展开全文
  • lua 入门

    2016-04-04 13:12:43
    curl -R -O http://www.lua.org/ftp/lua-5.3.2.tar.gz tar zxf lua-5.3.2.tar.gz cd lua-5.3.2 make macosx sudo make install

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,155
精华内容 862
关键字:

lua入门