什么是Lua

  Lua 是一个小巧的脚本语言。是巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de Janeiro)里的一个研究小组,由Roberto Ierusalimschy、Waldemar Celes 和 Luiz Henrique de Figueiredo所组成并于1993年开发。 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。Lua由标准C编写而成,几乎在所有操作系统和平台上都可以编译,运行。Lua并没有提供强大的库,这是由它的定位决定的。所以Lua不适合作为开发独立应用程序的语言。Lua 有一个同时进行的GIT项目,提供在特定平台上的即时编译功能。
  Lua脚本可以很容易的被C/C++ 代码调用,也可以反过来调用C/C++的函数,这使得Lua在应用程序中可以被广泛应用。不仅仅作为扩展脚本,也可以作为普通的配置文件,代替XML,ini等文件格式,并且更容易理解和维护。 Lua由标准C编写而成,代码简洁优美,几乎在所有操作系统和平台上都可以编译,运行。 一个完整的Lua解释器不过200k,在目前所有脚本引擎中,Lua的速度是最快的。这一切都决定了Lua是作为嵌入式脚本的最佳选择

Lua里的注释

单行注释

使用两个减号表示注释的开始,一直延续到行末位置。相当于C语言中的"//"。

1
2
--这里是一行注释
print("Hello Lanou")

多行注释

使用"--[["表示注释开始,使用"]]"表示注释结束。这种注释相当于C语言中的"/*"和"*/"。

1
2
3
--[[这里是第一行注释
这里是第二行注释]]
pring("Hello Panda")

Lua里的变量

在默认情况下,Lua里认为所有的变量都是全局变量。假如需要定义局部变量,则在声明变量时需要使用local说明。

并且在赋值的时候,允许同时给多个变量进行赋值。

1
2
3
4
5
6
7
8
9
10
11
-- i是一个局部变量
local i = 1
 
-- name是一个全局变量
name = "Lewis"
 
-- age,height都是局部变量
local age,height = 34,183.5
 
-- gender,company都是全局变量
gender,company = "男","蓝鸥"

  

Lua里的运算符

算数运算符

1
2
3
4
5
6
7
8
9
10
11
12
13
14
-- +(加法)
print(1 2)
 
-- -(减法)
print(1 2)
 
-- *(乘法)
print(1 2)
 
-- /(除法)
print(1 2)
 
-- ^(乘方)
print(1 2)

比较运算符

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
-- <(小于)
print(1 2)
 
-- >(大于)
print(1 2)
 
-- <=(小于等于)
print(1 <= 2)
 
-- >=(大于等于)
print(1 2)
 
-- ==(等于等于)
print(1 == 2)
 
-- ~=(不等于)
print(1 ~= 2)

逻辑运算符

在使用逻辑运算符时与C语言差别很大。

在Lua语言里,只有false和nil才为false,其他任何数据都是true,0也是true!!!

and 和 or 的运算结果不是true和false,而是和他的两个操作数相关。

a and b:如果a为false,则返回a;否则,返回b;

a or   b:如果a为true,则返回a;否则,返回b;

1
2
3
4
5
6
7
8
-- and(与)
print(1 and 2)
 
-- or(或)
print(1 or 2)
 
-- not(非)
print(1 not 2)

通过Lua里的这种特性,可以模拟C语言中的 ?:运算符

例如:C语言中的 x=a?b : c,在Lua中,可以写成 x = a and b or c。

Lua里的数据类型

关键字 描述
nil 空值,所有没有使用过的变量都是nil;nil既是值,又是数据类型
boolean 布尔类型,只有两个有效的值:true和false
number 数值类型,在Lua里,相当于C语言里的double
string 字符串,如果愿意的话,字符串是可以包含"\0"字符的
table 关系类型,这个类型的功能比较强大
function 函数类型,可以由函数类型来声明变量
userdata 这个类型专门与Lua的宿主打交道。宿主通常是由c语言和c++语言开发的,在这种情况下,userdata可以是宿主的任何类型,常用的是结构体和指针类型
thread 线程类型,在Lua里没有真正的线程。

Lua里的代码块

在C语言中代码块是有"{"和"}"括起来的,在Lua中,使用do和end关键字括起来的。

1
2
3
do
print("Hello")
end

Lua里的关系类型

关系类型,是一个非常强大的类型。这个类型类似于C++语言里的映射结构,类似于PHP语言里的array对象,类似于OC里的NSDictionary对象。

在Lua里的关系类型(Table)定义很简单,它主要特征是使用"{"和"}"来括起来一系列的元素。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
--声明一个关系类型的全局变量table
table = {}
 
--赋值关系变量table索引为0时的值是34
table[0] = 34
 
--同时也可以写成 table.name = "Lewis"
table["name"] = "Lewis"
table.gender = "男"
 
--同样也可以将索引为"son"的对象写成另外一个表格
table["son"] = {name = "DD",gender = "男"}
 
--访问对象时就可以使用
print(table.son.name)

同样也可以如下声明

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
-- 声明关系变量table
table = {
    10,--相当于[1] = 10
    [100] = 40,
 
 
    lewis = { -- 同样也可以写成 ["lewis"] = 
        age = 34, -- 同样可以写成 ["age"] = 34
        gender = "male",
    },
 
    20, --相当于[2] = 20
}
 
print(table[2])

Lua里的函数

在Lua中,函数的定义非常简单。不过要注意的一点就是,return语句一定要写在end之前。假如我们非要在函数中加一个return语句,那就应该写成

1
2
3
4
do
--return语句一定要在一个代码块结束前
return
end

函数举例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
-- 声明函数类型变量sum
function sum( v1,v2 )
    -- 函数体
    return v1 + v2
end
 
-- 同样函数变量也可以如下声明
mul = function (v1,v2 )
    -- 函数体
    return v1 * v2
end
 
--调用第一个函数sum
print(sum(2,3))
--调用第二个函数mul
print(mul(3,4))

Lua里的类

前边曾经说过,表类型可以拥有任意类型的值,包括函数!

因此,我们就可以创建一个具有函数变量的表。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
lewis = {
    age = 34,
    work = function (self,message)
        -- 函数体
        self.age = self.age + 1;
        print(self.age .. message)
    end
}
 
print(lewis.age)
lewis.work(lewis,"上班")
 
--也可以如下调用方法
lewis:work("上班")

结束

就像C语言一样,Lua里提供了很多的标准函数库来增强语言的功能。使用这些函数,可以很方便的操作各种数据类型。

可以参考《Programming in Lua》这本书。

[Lua]入门教程的更多相关文章

  1. [Lua]Lua入门教程

    什么是Lua Lua 是一个小巧的脚本语言.是巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de Janeiro)里的一个研究小组,由Rober ...

  2. Lua入门教程

    什么是Lua Lua 是一个小巧的脚本语言.是巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de Janeiro)里的一个研究小组,由Rober ...

  3. Openresty最佳案例 | 第2篇:Lua入门

    转载请标明出处: http://blog.csdn.net/forezp/article/details/78616622 本文出自方志朋的博客 什么是lua Lua 是一种轻量小巧的脚本语言,用标准 ...

  4. 超强、超详细Redis数据库入门教程

    这篇文章主要介绍了超强.超详细Redis入门教程,本文详细介绍了Redis数据库各个方面的知识,需要的朋友可以参考下 [本教程目录] 1.redis是什么2.redis的作者何许人也3.谁在使用red ...

  5. 【原】Redis入门教程

    最近在学习Redis,写几篇文章记录一下学习过程:Redis入门教程. 1.Redis基本概念 Redis Redis Keys Redis 基本数据类型 Redis基本操作 遍历操作 Pub-Sub ...

  6. 转:几十种编程语言的快速入门教程- learnxinyminutes.com

    原文来自于:http://top.jobbole.com/15551/ 这家网站的名称是 Learn X in Y minutes,包括了几十种编程语言的快速学习入门教程.打开几种编程语言来看了一下, ...

  7. [置顶] 轻量级语言Lua入门

    作为一个脚本爱好者,而且是脚本(Perl)起家的我,一有空就喜欢学习下这些脚本语言.据说魔兽世界.愤怒小鸟都用到了它,所以今天研究下Lua这个叫法有点奇特的脚本 [转载请注明出处:http://blo ...

  8. 超强、超详细Redis数据库入门教程(转载)

    这篇文章主要介绍了超强.超详细Redis入门教程,本文详细介绍了Redis数据库各个方面的知识,需要的朋友可以参考下   [本教程目录] 1.redis是什么 2.redis的作者何许人也 3.谁在使 ...

  9. 超强、超详细Redis入门教程【转】

    这篇文章主要介绍了超强.超详细Redis入门教程,本文详细介绍了Redis数据库各个方面的知识,需要的朋友可以参考下 [本教程目录] 1.redis是什么2.redis的作者何许人也3.谁在使用red ...

随机推荐

  1. YTU 2601: 熟悉题型——填空题(删除线性表节点)

    2601: 熟悉题型--填空题(删除线性表节点) 时间限制: 1 Sec  内存限制: 128 MB 提交: 357  解决: 212 题目描述 给出一串具体长度的数据,删除指定数据. 已经给出部分代 ...

  2. check if a linux process is done using bash 检查进程是否在运行

    # cat > check_process_is_end.sh while truedo   sleep 30 # seconds   res=`ps -ef | grep RNAhybrid` ...

  3. Codeforces Round #272 (Div. 2) C. Dreamoon and Sums (数学 思维)

    题目链接 这个题取模的时候挺坑的!!! 题意:div(x , b) / mod(x , b) = k( 1 <= k <= a).求x的和 分析: 我们知道mod(x % b)的取值范围为 ...

  4. core—线程与IO

    CPU执行线程期间,从内存里调用指令,然后运行,这些指令有可能要从硬盘里面,网络里,读取数据.我们知道在计算机硬件体系中,从内存读取数据的速度会大于从硬盘或网络里面的速度.线程必须要等到硬盘里面的数据 ...

  5. HDU 3068 (Manacher) 最长回文

    求一个字符串的最长子串,Manacher算法是一种O(n)的算法,很给力! s2[0] = '$',是避免在循环中对数组越界的检查. 老大的代码: http://www.cnblogs.com/Big ...

  6. Strom Topology执行分析:worker数,Bolt实例数,executor数,task数

    在创建Storm的Topology时,我们通常使用如下代码:builder.setBolt("cpp", new CppBolt(), 3).setNumTasks(5).none ...

  7. Windows系统下Memcached缓存系列二:CouchbaseClient(c#客户端)的详细试用,单例模式

    在上一篇文章里面 ( Windows系统下Memcached缓存系列一:Couchbase(服务器端)和CouchbaseClient(c#客户端)的安装教程 ),我们介绍了服务器端的安装和客户端的安 ...

  8. java基础 (记事本编写hello world,path,classpath,java的注释符)

    一:java的基本信息 jre 是指java运行环境,jdk 是指 java 开发工具集(并且里面是自带有jre运行环境的) jvm是指java的虚拟机 java的源代码的后缀名是 .java (例如 ...

  9. POJ2236 Wireless Network

    解题思路:简单并查集,注意时间限制是10000MS,每次进行O操作之后,   进行一次for循环,进行相关调整.同时注意输入输出格式,见代码: #include<cstdio> #incl ...

  10. 《Unix网络编程》卷2 读书笔记 第3章- System V IPC

    1. 概述 三种类型的System V IPC:System V 消息队列.System V 信号量.System V 共享内存区 System V IPC在访问它们的函数和内核为它们维护的信息上共享 ...