lua快速入门

2023-10-31

Lua语言简介

1993
年在巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de Janeiro in Brazil)诞生了一门编程语言,发明者是该校的三位研究人员,他们给这门语言取了个浪漫的名字——Lua,在葡萄牙语里代表美丽的月亮。事实证明她没有糟蹋这个优美的单词,Lua语言正如它名字所预示的那样成长为一门简洁、优雅且富有乐趣的语言。

Lua从一开始就是作为一门方便嵌入(其它应用程序)并可扩展的轻量级脚本语言来设计的,因此她一直遵从着简单、小巧、可移植、快速的原则,官方实现完全采用ANSI C编写,能以C程序库的形式嵌入到宿主程序中。Lua的每个版本都保持着开放源码的传统,不过各版采用的许可协议并不相同,自5.0版(最新版是5.1)开始她采用的是著名的MIT许可协议。正由于上述特点,所以Lua在游戏开发、机器人控制、分布式应用、图像处理、生物信息学等各种各样的领域中得到了越来越广泛的应用。其中尤以游戏开发为最,许多著名的游戏,比如Escape from Monkey Island、World of Warcraft、大话西游,都采用了Lua来配合引擎完成数据描述、配置管理和逻辑控制等任务。

作为一门过程型动态语言,Lua有着如下的特性:

1、变量名没有类型,值才有类型,变量名在运行时可与任何类型的值绑定;

2、语言只提供唯一一种数据结构,称为表(table),它类似key-value关联数组,可以用任何类型的值作为key和value。提供了一致且富有表达力的表构造语法,使得Lua很适合描述复杂的数据;

3、函数是一等类型,支持匿名函数和正则尾递归(proper tail recursion);

4、支持词法定界(lexical scoping)和闭包(closure);

5、提供thread类型和结构化的协程(coroutine)机制,在此基础上可方便实现协作式多任务;
6、运行期能编译字符串形式的程序文本并载入虚拟机执行;

7、通过元表(metatable)和元方法(metamethod)提供动态元机制(dynamic meta-mechanism),从而允许程序运行时根据需要改变或扩充语法设施的内定语义;

8、能方便地利用表和动态元机制实现基于原型(prototype-based)的面向对象模型;

9、从5.1版开始提供了完善的模块机制,从而更好地支持开发大型的应用程序;

Lua的语法类似PASCAL和Modula但更加简洁,所有的语法产生式规则(EBNF)不过才60几个。熟悉C和PASCAL的程序员一般只需半个小时便可
将其完全掌握。而在语义上Lua则与Scheme极为相似,她们完全共享上述的1、3、4、6点特性,Scheme的continuation与协程也基本相同只是自由度更高。最引人注目的是,两种语言都只提供唯一一种数据结构:Lua的表和Scheme的列表(list)。正因为如此,有人甚至称Lua为“只用表的Scheme”。

库和工具相比Java、Python、Perl,Lua的开源工具和库可能并不算多,但其中不乏优秀之作。以下介绍的资源均可在http://luausers.org/wiki/LuaAddons上找到,而且绝大多数都遵循着与Lua相同的许可协议。


lua作为很好的嵌入式语言可以非常好的作为c/c++补充,在游戏行业是得到了广泛的应用。

Lua能对面向对象编程,函数式编程,数据驱动式编程提供很好的支持。作为一个扩展式语言,Lua没有 "main" 程序的概念:它只能嵌入一个宿主程序中工作,这个宿主程序被称作embedding program或简称为host。宿主程序可以通过调用函数执行一小段Lua代码,可以读写Lua变量,可以注入C函数让Lua代码调用。这些扩展的C函数,可以大大的扩展了Lua可以处理事务的领域,这样就可以订制出各种语言,而它们共享一个统一的句法格式的框架。Lua的官方发布版就包含了一个叫做Lua的简单的宿主程序,它用Lua库提供了一个保证独立的Lua解释器。

很多网站宣传Lua语言作为脚本开发了《魔兽世界》,其实Lua语言只是开发了《魔兽世界》的插件,几乎所有的《魔兽世界》插件都是使用解释性的脚本Lua编写,核心的C++代码只占全部代码中的很小一部分比重。在传统平台上Lua最流行的应用场景是在游戏中作为处理逻辑的脚本,即用来编写游戏的任务脚本,以实现游戏的可配置性和可扩展性。在游戏中Lua脚本的加载不需重启服务器,尽管脚本的运行效率低于编译好的二进制代码,但目前CPU速度已完全能够让Lua脚本迅速解释执行。这也正是包括《魔兽世界》、《战锤40K》、《仙境传说》、《博德之门》和《轩辕剑外传汉之云》在内的众多游戏选择Lua开发插件的原因。

和Python等脚本不同,Lua并没有提供强大的库,这是由它的定位决定的。所以Lua不适合作为开发独立应用程序的语言。不过Lua还是具备了比如数学运算和字符串处理等基本的功能。

一直在思考,能不能把他引入商业领域的规则语言呢?将业务规则经常变的部分提炼出来,而无须重新编译程序。作为规则引擎的角色进行使用。

使用前当然得安装一下去http://www.lua.org/下载一个 Lua_v5.1.4.23.exe安装,装完之后执行。

可以用 lua.exe逐行解释的方式,或者写完脚本用lExecutor.wlua执行

1)先来个helloworld

>   print   ' helloWorld '
helloWorld
>   print ( " helloWorld " ) --注释是这么写的!
helloWorld
>  a = ' hello '
>   print (a)
hello

2)主要类型

>  a = 1
>  b = " abc "
>  c = {}
>  d = print
>
>   print ( type (a))
number
>   print ( type (b))
string
>   print ( type (c))
table
>   print ( type (d))
function
>

  如上所示,lua主要有四种类型,即数字,字符串,table(其实理解可以理解为javascript的object),以及函数类型

当然了,还有最常的bool型了,true以及false,(这里不考虑nil,以及userdata,thread等)

函数类型的变量,加上"() "即可以执行,如

>  d(b)
abc

 3)变量及常量,字符串

>  a,b,c,d  =   1 , 2 , ' c ' ,{ 1 }
>   print  (a,b,c,d)
1         2        c       table: 0041BC58
>  a = " single 'quoted' string and double \ " quoted\ "  string inside "
>  b = ' single \ ' quoted\ '  string and double "quoted" string inside '
>  c =   [[  multiple line
>> with'single'
>> and "double" quoted strings inside.
]]
>
>   print (a)
single 
' quoted '  string  and  double  " quoted "  string inside
>   print (b)
single 
' quoted '  string  and  double  " quoted "  string inside
>   print (c)
 multiple line
with
' single '
and   " double "  quoted strings inside. 
>  a=a.."看我给接上"  --字符串用两个..可以进行连接
>   print (a)
single 
' quoted '  string  and  double  " quoted "  string inside 看我给接上

我们关注一下lua比较特别的地方

  • 声明变量及给变量赋值的时候,可以多变量一起赋值
  • 字符串常量可以用双引号及单引号,并且混用的时候无须转义字符,跟php有点类似,还可以用"[[]]"括起来,
    这一点类似于c#里面字符串可以加上@符号,可以保留字符串内的格式

 4)逻辑控制语句

>  a = 10   -- 逻辑控制语句就不费口舌了 ,反正就这几个词,跟pl/sql有点像
>   if  a == 10   then
>>   print ( " 我是10 " )
>>   elseif  a ==   11   then
>>   print ( " 我是11 " )
>>   else
>>   print ( " 我是水户洋平等等 " )
>>   end
我是10

5)循环结构


> --第一种while循环
> a=1
> while a~=10 do
>> io.write(a.."  ")
>> a=a+1
>> end
1  2  3  4  5  6  7  8  9  >
> --第二种repeat、until循环
> a=0
> repeat
>>      a=a+1
>>      print(a)
>> until a==5
1
2
3
4
5
> --第三种for循环
> for a=1,4 do
>>      io.write(a)
>> end
1234>
> --比较特别,有个步进的概念,如下是以2为步进
13> for a=1,4,2 do
>> io.write(a..' ')
>> end
1 3 > for a=1,5,2 do
>> io.write(a.. '  ')
>> end
1  3  5  >

6)函数及其使用

>   -- 1.先来个最简单的
>   function  myFunc1()
>>        print ( " hello function " )
>>   end
>  myFunc1()
hello 
function
>   -- 2.再来个带参数的
>  a = 1
>  b = 2
>   function  myFunc2(par1,par2)
>>        return  par1 + par2
>>   end
>  c = myFunc2(a,b)
>   print (c)
3
>   -- 3.甚至可以返回多个变量
>  a = 1
>  b = 2
>   function  myFunc3(A,B)
>>        return  B,A
>>   end
>  c  =  myFunc3(a,b)  -- c会等于返回的第一个,在此倒转过来即为2
>   print (c)
2
>  c,d = myFunc3(a,b)  -- 当然如果给多个变量赋值就没有问题了
>   print (c,d)
2         1
>   print (myFunc3(a,b))  -- 直接打印就把所有打印出来
2         1
>   -- 4.还可以是变参
>   function  myFunc4()
>>   print ()
>>   end
>  myFunc4(a,b,c,d)
1         2         2         1

 7)table(我觉得理解object也可以)的使用

>  linbc = {} 
>  linbc.sex  =   " "
>  linbc.age  =   27
>   print (linbc,linbc.sex,linbc[ " age " ])
table: 0041ED50 男      
27
>  A = linbc
>   print (A[ " sex " ])

>   print (A)   -- 引用类型,看A以及linbc内存地址是一样的
table: 0041ED50
>    -- 瞧这用法,跟javascript的用法基本相当
>    -- 其实还可以理解为hashmap似的键值对
>   for  i,v  in   pairs (linbc)  do
>>      print (i,v)
>>   end
age     
27
sex     男
>    -- 也可以作为数组,下标是从1开始的喔
>  arr = { 1 , 2 , 3 , " a " , ' b ' ,linbc}
>   for  i,v  in   pairs (arr)  do
>>      print (i,v)
>>   end
1         1
2         2
3         3
4        a
5        b
6        table: 0041ED50
>    -- 既然作为数组吧,那肯定是可以增加记录的吧
>   table.insert (arr,A)
>  table.foreach(arr, function (i,v)  print (v)  end )
1
2
3
a
b
table: 0041ED50
table: 0041ED50
>   -- 瞧上面,可以foreach,还可以用匿名函数喔
>   -- 当然也可以用下标访问了
>   print (arr[ 1 ])
1
>   -- 调用table.insert会自动给增加下标,如
>   table.insert (linbc, " hello " )
>   print (arr[ 1 ])
1

 

基本上lua是一门比较简洁的语言,感觉跟javascript like 80%,很轻量级


http://blog.163.com/swmwoaini@yeah/blog/static/10898942020095291166724/

http://www.centoscn.com/yunwei/Lua/2013/0820/1389.html

http://blog.csdn.net/user_920/article/details/8305991


很好的lua入门教程  《step by step lua》

http://www.cnblogs.com/stephen-liu74/archive/2012/07/30/2487201.html


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

lua快速入门 的相关文章

  • 如何在多个Lua State(多线程)之间传递数据?

    我在中启动Redis连接池redis lua 通过从 C 调用 我得到了redis lua state 此 Lua 状态全局启动一次 仅在其他线程中启动get从中 当有一个 HTTP 请求 工作线程 时 我需要从redis lua stat
  • C 的哪些部分最可移植?

    我最近读到了 Lua 联合创始人 Luiz H de Figueredo 和 Roberto Ierusalimschy 的采访 他们讨论了 Lua 的设计和实现 至少可以说这是非常有趣的 然而 讨论的一部分让我想起了一些事情 Robert
  • 如何解密Lua字节码?

    早上好 我正在尝试破译 Moon 字节码 但我无法以任何方式 有人可以帮助我吗 我有这个 例如 code 27 76 117 97 81 0 1 4 4 4 8 0 如何将此字节码解密为文本 我已经在这里搜索 http www asciit
  • lua http套接字超时

    LuaSocket HTTP 模块文档说可以在 HTTP 连接上设置超时 可以设置以下常量来控制 HTTP 模块的默认行为 PORT 用于连接的默认端口 PROXY 用于连接的默认代理 TIMEOUT 设置所有I O操作的超时时间 USER
  • Lua-迭代嵌套表

    我已经学习 Lua 几个星期了 这一次又一次成为我的症结所在 我尝试阅读有关该主题的帖子和书籍 我使用 Lua 查询软件监控系统 Nimsoft 我的数据以表格形式返回给我 我不会发布整个输出 但这里有一个我认为可以描述结构的片段 表参考是
  • 什么时候适合使用Lua这样的嵌入式脚本语言

    我玩 魔兽世界 大约有两年了 我对用来编写插件的 Lua 很好奇 由于到目前为止我读到的有关 Lua 的内容都是 快 轻 和 这太棒了 所以我想知道如何以及何时使用它 您需要在系统中嵌入像 Lua 这样的脚本语言的典型情况是什么 当您需要最
  • Lua userdata:无法同时进行数组访问和方法

    我遇到了这个人的问题 Lua userdata数组访问及方法 https stackoverflow com questions 26970316 lua userdata array access and methods 其中 当我设置用
  • Lua 从 5.1 更新 - LUA_GLOBALSINDEX 问题

    我最近将旧的 Lua 5 1 项目更新到了该库的最新版本 但遇到了问题LUA GLOBALSINDEX 它变得不确定 我只用过它lua getfield函数 像这样 void luastartgame void if startgamefu
  • Lua中如何在另一个表的表成员中搜索

    我正在编写一个 lua 程序 它有一个表 该表是另一个表的成员 当我向该成员表添加新日期时 一切正常 但是 当我想在该表中搜索时 无论我给出什么键 我总是会将最后一行添加到表中 如何在该成员表中正确搜索 Stream name functi
  • VB6 - Lua 集成

    我想知道是否有人有任何集成 Lua 和 VB6 的技巧 我正在运行一个小型在线角色扮演游戏 添加一些脚本会很棒 嗯 这是可行的 我曾经为 Lua 5 0 2 做过 但找不到文件 在您拥有的选项中 您可以 将 Lua 封装在公开 Lua AP
  • Lua 将字符串转换为数字 - 取决于语言环境

    刚刚注意到字符串 and tonumber 在 Lua 中是依赖于语言环境的 知道如何在不使用的情况下将字符串转换为数字tonumber 谢谢 例如将字符串 58 5 转换为 58 5 另外 当我尝试将带点的数字传递给函数时 该函数会转换
  • 如何使用 srlua 制作可执行的 Lua 脚本?

    我的主要目标是使我的 lua 文件成为可执行文件或使其成为咬代码 最好是两者皆有 我正在尝试 srlua 但在自述文件中它告诉我要做的事情 对于Windows 您需要首先创建srlua exe和glue exe 然后为每个 你想把Lua程序
  • gsub 的转义字符串

    我读了一个文件 local logfile io open log txt r data logfile read a print data output n w r 1 2 n t x re S 是的 日志文件看起来很糟糕 因为它充满了各
  • Lua 上的 For 循环

    我的作业是如何执行 for 循环 我已经从数字上弄清楚了 但无法从名称上弄清楚 我想创建一个 for 循环来运行名称列表 以下是我到目前为止所拥有的 names John Joe Steve for names 1 3 do print n
  • 如何在 Lua - Lightroom 插件中使用 HMAC

    首先我要提的是我对 Lua 真的很陌生 如果你认为我的问题太愚蠢 请耐心等待 这是我的要求 我需要使用 HMAC sha256 进行 Lightroom 插件开发 因为我使用它是为了安全 我试图使用这个但没有运气https code goo
  • 在 lua 中加载 C++ 模块时出现“尝试索引字符串值”错误

    我正在尝试使用 lua 用 C 编写的函数 下面给出的是cpp文件 extern C include lua h include lauxlib h include lualib h static int add 5 lua State L
  • 适用于 IEEE 802.15.4 的 Wireshark Lua 解析器 - DissectorTable 名称?

    我正在lua中开发wireshark解析器来解析基于802 15 4的自定义协议 不幸的是我无法找出正确的 DissectorTable 名称 table DissectorTable get wpan wpan does not work
  • 如何从表成员中引用lua表成员?

    我在 lua 有一张表 enUS LOCALE STHOUSANDS Thousands separator e g comma patNumber d LOCALE STHOUSANDS d regex to find a number
  • Linq 是如何工作的(在幕后)?

    我正在考虑为 Lua 制作类似 Linq 的东西 并且我大致了解 Linq 的工作原理 但想知道是否有一篇好文章 或者是否有人可以解释 C 如何使 Linq 成为可能 注意 我的意思是在幕后 比如它如何生成代码绑定等等 而不是最终用户语法
  • 如何循环遍历表并保持顺序?

    我得到了下表 local a 12 30 24 60 60 year 30 24 60 60 month 24 60 60 day 60 60 hour 60 minute 1 second 但是 当我对它进行配对循环并打印 key val

随机推荐

  • 从浏览器地址栏输入url到显示页面的步骤

    浏览器输入URL到渲染过程解析 从浏览器地址栏输入url到显示页面的步骤 从浏览器地址栏输入url到显示页面的步骤 目录 1 概述 2 DNS域名解析 3 三次握手与四次挥手 4 DOM CSSOM 渲染树的构建 渲染与绘制 1 概述 浏览
  • Mac里的airdrop传输文件

    01 两方打开 02 设置对所有人可以发现 03 右键需要传输的文件 04 选择共享 airdrop 05 点击页面上的名称 开始传输 note 可以传输 app文件 这样可以大大节省下载安装所要耗费的时间 word只要一分钟就能从从无到有
  • 机器学习_深度学习毕设题目汇总——图像生成

    下面是该类的一些题目 题目 基于生成式对抗网络的无监督图像生成研究 用于图像生成的机器学习算法在人像合成中的研究与应用 可抵抗相机抖动的高动态图像生成算法研究 图像生成诗歌的端到端模型研究 基于GANs的脑部MRI图像生成方法研究 基于GA
  • 问二十四:分类说明JUC包常用类有哪些?

    JUC中常用类汇总 JUC的atomic包下运用了CAS的AtomicBoolean AtomicInteger AtomicReference等原子变量类 JUC的locks包下的AbstractQueuedSynchronizer AQ
  • 【Ensemble Learning】第 3 章:混合模型

    在第2章中 您学习了如何以不同方式划分和混合训练数据以构建集成模型 其性能优于在未划分数据集上训练的模型 在本章中 您将学习不同的组装方法 与混合训练数据方法不同 混合模型方法在不同的机器学习模型中使用相同的数据集 然后以不同的方式组合结果
  • pads win10显示不全

    打开注册表 WIN R 1 路径 HKEY LOCAL MACHINE SOFTWARE Microsoft Windows NT CurrentVersion Fonts 将原来的 Microsoft YaHei TrueType Mic
  • C++ Vector容器的push_back( )与pop_back( )函数

    C Vector容器的push back 与pop back 函数 push back pop back 参考链接 push back 函数将一个新的元素加到vector的最后面 位置为当前最后一个元素的下一个元素 push back 在V
  • java IDEA加密/解密 源码

    package tool import org apache commons codec binary Base64 import org bouncycastle jce provider BouncyCastleProvider imp
  • Git如何Check Out出指定文件或者文件夹

    原文 http www handaoliang com a 20140506 195406 html 在进行项目开发的时候 有时候会有这样的需求那就是 我们只希望从Git仓库里取指定的文件或者文件夹出来 在SVN里面 这非常容易实现 因为S
  • 实训9——门磁报警

    实验九 门磁报警 一 实验目的 通过门磁传感器 判断三种开门方式 1 正常开门 就是有正常开门方式 例指纹开门 蓝牙开门后 主人打开门 触发门磁 2 门未关好 在正常开门后 主人没有即使关门 会引发门未关好报警 3 有人撬门 非正常开门 即
  • [Python人工智能] 十五.无监督学习Autoencoder原理及聚类可视化案例详解

    从本专栏开始 作者正式研究Python深度学习 神经网络及人工智能相关知识 前一篇文章详细讲解了循环神经网络LSTM RNN如何实现回归预测 通过sin曲线拟合实现如下图所示效果 本篇文章将分享无监督学习Autoencoder的原理知识 然
  • 用户增长漫谈二

    除了功能迭代 增量开发配套敏捷理念 这里重要谈一个概念 宏观 微观上都有可取之处 品牌架构 反应企业意愿 个性 未来可能性留存 兼容不同利益群体方式进程商业活动 主品牌 标识性弱 但是个性强烈 业务 产品特性底的处理方式 以资金 实力彰显
  • MyBatis 学习笔记(八)---源码分析篇--SQL 执行过程详细分析

    前言 在面试中我们经常会被到MyBatis中 占位符与 占位符的区别 大多数的小伙伴都可以脱口而出 会对值进行转义 防止SQL注入 而 则会原样输出传入值 不会对传入值做任何处理 本文将通过源码层面分析为啥 可以防止SQL注入 源码解析 首
  • JS逆向爬虫案例分享

    某域网站数据爬取之反爬策略JS逆向分析 本次分享解析某域网站数据的反爬机制 此次只做技术分享 如有侵权 请联系删除 1 分析网 首先打开网站发送请求 点击F12 发送请求发现电脑端并没有接口返回数据 即返回切换手机端观察 点解F12观察找到
  • Mplayer 1.0pre5 安装纪实

    一开始装了个realone gold 版 但是怎么弄都没有声音 没有办法 只能硬着头皮装mplayer 了 刚刚接触linux 真的是什么也不懂 连看个电影也得费这么大的事 搞了一天 终于算是能看到图像和声音来 现在是只其然 但不怎么知所以
  • 【医学图像分割】读论文系列 1

    医学图像分割 读论文系列 1 文章目录 医学图像分割 读论文系列 1 Title Introduction Abstract Keyword Method Experiment Conclusion Title 标题 Noisy Label
  • JS - 手写节流、防抖

    目录 节流 解释 手写实现 全部计时器实现 Date now 时间戳实现 混合 防抖 解释 手写实现 节流 解释 节流 throttle 是指让某一个函数的触发次数在一定时间内限定在一定范围内 最常的情况是一定时间内只触发最初的一次 常用在
  • 01_Numpy的图片处理(读取,变换,保存)

    Numpy的图片处理 读取 变换 保存 使用Numpy的ndarray可以读取图片文件 并且可以对图片进行各种各样的处理 例如 图片像素值的读取 替换 随机剪裁 拼接等等都可以使用ndarray 对于已经习惯使用Numpy的人们来说 已经可
  • Springboot集成华为云OBS

    Springboot实现华为云对象存储OBS文件上传下载 文章目录 Springboot实现华为云对象存储OBS文件上传下载 前言 一 OBS是什么 二 使用步骤 1 引入依赖 2 HuaweiyunOss工具类 3 上传下载测试 总结 前
  • lua快速入门

    Lua语言简介 1993 年在巴西里约热内卢天主教大学 Pontifical Catholic University of Rio de Janeiro in Brazil 诞生了一门编程语言 发明者是该校的三位研究人员 他们给这门语言取了