Lua语言新手简单入门教程

一、前言

Lua 是一种轻量小巧的脚本语言,用标准 C 语言编写并以源代码形式开放,其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。

Lua 可以应用在游戏开发、独立应用脚本、Web 应用脚本、扩展和数据库插件、安全系统等场景。

笔者学习的目的主要是为了能在 Web 应用(Nginx、Redis)中使用到 Lua 脚本。

特点

  • Lua脚本可以很容易的被C/C++ 代码调用,也可以反过来调用C/C++的函数。
  • Lua由标准C编写而成,代码简洁优美,几乎在所有操作系统和平台上都可以编译,运行。
  • 以极小的体积和简单的语法提供全面的功能。[一个完整的Lua解释器不过200k,在目前所有脚本引擎中,Lua的速度是最快的]
  • 实现与宿主语言的简洁接口
  • 成为一个很容易嵌入其它语言中使用的语言。

特性

  • 支持面向对象编程
  • 轻量级
  • 可扩展
  • 函数式编程
  • 自动内存管理
  • 通用类型的表–table,可实现数组,哈希表,集合,对象
  • 支持闭包
  • 支持多线程
  • 支持交互式编程

二、安装

注意:请确保安装 Lua 之前系统已安装 readline 和 readline-devel。如果没有则键入 yum install -y readline readline-devel 进行安装。

curl -R -O http://www.lua.org/ftp/lua-5.3.4.tar.gz
tar zxf lua-5.3.4.tar.gz
cd lua-5.3.4
make linux test

测试,命令行中键入 lua -v:

Lua 5.1.4 Copyright (C) 1994-2008 Lua.org, PUC-Rio

显示 Lua 版本说明安装正确。

三、运行方式

与其他脚本语言一样,我们需要将 Lua 代码编写在文件中,后缀名为 .lua。

运行该文件的代码时,只需在命令行键入 lua xx.lua 即可。

四、语法

4.1 数据类型

Lua 中包含 8 种基本数据类型,即:nil、boolean、number、string、userdata、function、thread 和 table。

数据类型 说明
nil 表示无效值,在条件表达式中表示 false。
boolean 布尔值,包含 true 和 false 两个值。
number 表示双精度类型的实浮点数。
string 表示字符串,通过双引号或单引号括住。
userdata 表示任意存储在变量中的 C 数据结构
function 表示 C 或 Lua 编写的函数
thread 表示执行的独立线程,用于执行协同程序。
table 表示一个关联数组,数组索引可以是数字或字符串。

例如:

a=10
str="hello world"

不需要声明变量类型,我们可以通过 type() 判断变量类型。

注意:

Lua 变量有三种类型:全局变量、局部变量和表中的域;

默认情况下,不管在哪声明的变量都是全局变量。通过 local 修饰的变量为局部变量;

变量默认值为 nil。

4.2 运算符

1) 赋值运算符

str="hello".."world" -- 通过 .. 连接字符串
a,b=10,15 -- a=10,b=15
c,d,e=1,2 -- c=1,b=2,e=nil

2) 算术运算符

与其他程序设计语言类似。

a,b=10,15
c=a+b -- 加号
d=a-b -- 减号
e=a*b -- 乘号
f=a/b -- 除号
g=a%b -- 求余
h=a^2 -- 求乘方
i=-a -- 负号

3) 关系运算符

与其他程序设计语言类似。

a,b=10,15
print(a>b) -- 大于
print(a<b) -- 小于
print(a==b) -- 等于
print(a~=b) -- 不等于

4) 逻辑运算符

print(true and false) -- 与
print(true or false) -- 或
print(not true) -- 非

5) 其他运算符

操作符 说明
.. 连接两个字符串
# 返回字符串或表的长度,如 #“lua”

4.3 流程控制

1) 条件判断,有 3 种写法。

-- if 语句
if(true)
then
 print("hello")
end
-- if .. else 语句
a,b=10,15
if(a>b)
then
 print(a)
else
 print(b)
end
-- if 嵌套
c=20
if(c>10)
then
 if(c<30)
 then
 print(c)
 end
end

2) 循环,有 4 种写法。

类型 说明
while 循环 在条件为 true 时,让程序重复执行语句。
for 循环 重复执行指定语句,重复次数在 for 中控制。可以遍历数字和泛型。
repeat .. until 重复执行循环,直到指定条件为真为止。
循环嵌套 循环内嵌套多个循环语句。

例如:

-- while 循环
a=10
while(a>0)
do
 print(a)
 a=a-1
end
-- for 循环,遍历数字
for a=1,10,1 do
 print(a)
end
-- repeat .. until 循环
a=10
repeat
 print(a)
 a=a-1
until(a<1)

4.4 数组

Lua 数组大小不固定且下标从 1 开始。

arr={"h","e","l","l","o"}
-- 此处使用遍历数字方式
for index=1,#arr do
 print(arr[index])
end
-- 此处使用遍历泛型方式
for i,v in ipairs(arr) do
 print(i,v)
end

4.5 函数

-- 案例 1
function calc(a,b,c)
 return a+b+c
end
result=calc(1,2,3)
print(result)
-- 案例 2
function getCalc(a,b,c)
 return a,b,c
end
r1,r2,r3=getCalc(1,2,3)
print(r1,r2,r3)

Lua 中的函数允许返回多个值。

4.6 table

table 是 Lua 中的一个数据结构,类似于 Java 中的 Map 类型或 Javascript 中的 JSON 对象。

Lua table 使用关联数组,我们可以使用任意类型值作为数组的索引,但不能是 nil。

Lua table 大小不固定。

person={}
person.name="jack"
person.age=20
print(person[1])
print(person.name)
print(person["age"])

4.7 模块和包

模块类似于一个封装库。从 Lua 5.1 开始,Lua 加入标准的模块管理机制,可以将一些公用的代码放在一个文件中,以 API 接口的形式在其他地方调用,有利于代码的重用和降低代码耦合。

Lua 的模块由变量、函数等已知元素组成的 table 。

例如:

创建名为 module.lua 的文件。

module={}
module.index=1
function module.sum(a,b)
 return a+b
end

另一个文件引入:

-- 此处 module 是文件名
require "module"
-- 此处 module 是引入模块中定义的名称
print(module.index)
print(module.sum(1,2))

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

(0)

相关推荐

  • Lua入门学习笔记

    最近在使用Cocos2d-x + Lua来开发游戏. 游戏的主要逻辑将在Lua里写,之前没有接触过Lua,以下是我总结的入门笔记. 运算符 逻辑运算符 与:and 或:or 非:not 逻辑判断只有在false和nil时为假,其余均为真. or和and会返回第一个断路的值. Lua中没有C语言的三元符(x ? a : b),但有一个替代方案(x and a) or b. 需要注意的是,以上方案在x为true,a为false,b为true的情况下与三元符的结果是相反的. 关系运算符 不等于:~=

  • Lua极简入门指南(一):函数篇

    Lua 和其他很多语言一样,函数调用时参数列表被包裹在括号中: 复制代码 代码如下: print('Hello World') 特别的情况是,如果函数调用时只有一个参数,并且此参数为字符串 literal(字面量)或者 table 构造器(constructor)时,包裹参数的括号可以省略: 复制代码 代码如下: print 'Hello World' <--> print('Hello World') type{}              <--> type({}) Lua 为

  • Lua极简入门指南(一):基础知识篇

    本文是<Programming in Lua 3rd>读书笔记. Chunks 一个 Chunk 就是一组被执行的语句,例如一个文件或者交互模式下的一行. 标识符(identifiers) 我们应该避免使用以 _ 开头并跟上一个或者多个大写字母的字符串来作标识符,它们被保留作特殊的用途(例如:_VERSION). 注释 单行注释使用 复制代码 代码如下: -- 多行注释使用 复制代码 代码如下: --[[ 和 --]] 类型简介 Lua 存在的数据类型包括: 1.nil.此类型只有一个值 ni

  • lua脚本语言快速入门教程

    lua作为很好的嵌入式语言可以非常好的作为c/c++补充,在游戏行业是得到了广泛的应用 一直在思考,能不能把他引入商业领域的规则语言呢?将业务规则经常变的部分提炼出来, 而无须重新编译程序.作为规则引擎的角色进行使用 使用前当然得安装一下去http://www.lua.org/下载一个 Lua_v5.1.4.23.exe安装,装完之后执行 可以用 lua.exe逐行解释的方式,或者写完脚本用lExecutor.wlua执行 1)先来个helloworld 复制代码 代码如下: > print '

  • Lua脚本语言基本语法快速入门教程

    Lua语法与C语言有些相似也不太一样,写了语句学一下 微笑 --begin a = --[[explain]] "ha"; print(a) if a == "ha" then print("if test passed") else print("if used wrong") end b,c=2,3 print(b,c) b,c=c,b if b==3 and c==2 then print("swap test

  • Lua极简入门指南:全局变量

    全局环境 Lua 把全局变量放在一个 table _G 中,这个 table 被叫做全局环境(global environment).打印所有的全局变量名: 复制代码 代码如下: for n in pairs(_G) do print(n) end _ENV(Lua 5.2 开始支持) 对于一个 free name(名字没有绑定任何声明)var 实际上会被转换为 _ENV.var(每个 chunk 中都会存在一个名为 _ENV 的变量): 复制代码 代码如下: v1 = 1 local v2 =

  • Lua脚本语言简明入门教程

    这几天系统地学习了一下Lua这个脚本语言,Lua脚本是一个很轻量级的脚本,也是号称性能最高的脚本,用在很多需要性能的地方,比如:游戏脚本,nginx,wireshark的脚本,当你把他的源码下下来编译后,你会发现解释器居然不到200k,这是多么地变态啊(/bin/sh都要1M,MacOS平台),而且能和C语言非常好的互动.我很好奇得浏览了一下Lua解释器的源码,这可能是我看过最干净的C的源码了. 我不想写一篇大而全的语言手册,一方面是因为已经有了(见本文后面的链接),重要的原因是,因为大篇幅的文

  • Lua极简入门指南(三): loadfile和错误处理

    编译 Lua 虽然是解释性语言,但 Lua 源码总是被编译为中间形式后再执行. dofile 用于载入并执行一个 Lua 文件,相比之下,loadfile 用于载入一个 Lua 文件,但并不执行,确切的说 loadfile 编译了一个 chunk,并返回此被编译的 chunk(被作为一个函数): 复制代码 代码如下: c = loadfile('./test.lua') c() dofile 可以被实现为: 复制代码 代码如下: function dofile(filename)     loc

  • Lua 极简入门指南(七):面向对象编程

    类 在很多面向对象的语言中有类(class)的概念,对象是类的实例.Lua 中不存在类的概念.Lua 就像 JavaScript 一样是面向原型的语言(http://en.wikipedia.org/wiki/Prototype-based_programming),这类语言使用一个对象表示一个"类",其他对象(此类的实例)使用此对象作为原型.我们有两个 table p 和 obj,将 p 设置为 obj 的原型(回顾:http://www.jb51.net/article/56690

  • Lua极简入门指南(六):模块

    从用户的角度来看,一个模块能够通过 require 加载并返回一个 table,模块导出的接口都被定义在此 table 中(此 table 被作为一个 namespace).所有的标准库都是模块.标准库被预先加载了,就像这样: 复制代码 代码如下: math = require 'math' string = require 'string' require 函数 使用 require 函数加载模块能够避免多次重复加载模块.加载一个模块: 复制代码 代码如下: require 'modulena

随机推荐