Lua学习笔记(二):基本语法

Lua学习指南:http://www.lua.org/manual/

首先我们要明确的一点是:在Lua中,除了关键字外一切都是变量。

Lua关键字

可以查看这个地址:http://www.lua.org/manual/5.1/manual.html#2.1

关于分号

语句的最后可以用分号";"表示结束,也可以不写。

而对于一行有多个语句的情况下,语句之间可以用分号";"隔开,也可以用空白隔开。一般来说,建议总是用分号隔开。

使用注释

单行注释使用“--”即可,以后的内容都会被当做注释;

多行注释以“--[[”开始,以“]]”结束。

变量

声明

由于是动态类型,所以变量声明时不需要声明类型,但是一定要进行赋值,如果希望是空类型,可以赋值nil,如下:

1 num = 100--数字100
2 str = "abc"--字符串abc
3 obj = nil--空类型

注意在Lua中所有的变量和关键字都是大小写敏感的。

赋值

可以一次对多个变量赋值,规则:如果等号(“=”)右边多了,则舍弃,左边多了,则赋值为空(nil) 。

表达式 a,b=b,a表示a和b的值交换,类型不一样照样可以交换。

1 a, b, c = 100, "abc"
2 print(a, b, c)--100 abc nil
3
4 a, b = b, a
5 print(a, b, c)--abc 100 nil

类型

我们看看Lua内置的基本数据类型都有哪些:

  • nil:表示变量还没有被赋值,可以看做删除该变量的意思;
  • Boolean:布尔类型,true和false;
  • number:数字类型,内部以double表示;
  • string:字符串,总是以零结尾,但可以包含任意字符(包括零),因此并不等价于C字符串,而是其超集;
  • table:表,实际是一个关联数组,索引可以使用数字或字符串,不同于其他语言的数组把0作为数组的初始索引,在Lua里表的默认初始索引一般以1开始。table的变量只是一个地址引用,对table的操作不会产生table的副本或创建新的table,table不会固定长度大小,有新数据添加时table长度会自动增长,没初始的table都是nil;
  • function:函数,可以作为匿名函数来使用;
  • userdata:用户(非脚本用户)定义的C数据结构,脚本用户只能使用它,不能定义;
  • thread:Lua协作线程(coroutine),与一般操作系统的抢占式线程不一样;

接下来的笔记会着重介绍这些核心的基本数据类型。

而判断变量究竟是什么类型依靠的是他的值,我们看看下面的例子:

 1 num = 100
 2 str = "abc"
 3 obj = nil
 4 func = print
 5
 6 print(type(num))--number
 7 print(type(str))--string
 8 print(type(obj))--nil
 9 print(type(func))--function
10
11 func = str
12
13 print(type(func))--string

全局和局部

默认声明的变量都是全局变量,表示可以在全局范围内进行访问,而局部变量则是在声明之前添加local关键字,如下:

1 local num
2 local str = "abc"
3
4 print(num)--nil
5 print(str)--abc

全局变量声明时必须赋值,而局部变量则不需要。

do...end可以声明一个程序块,局部变量的生命周期在自己的程序块和子程序块中:

 1 function main()
 2   do
 3     local num = 100
 4     print(1, num)--1  100
 5     do
 6       print(2, num)--2  100
 7     end
 8   end
 9   print(3, num)--3  nil
10 end
11
12 main()

运算符

算术运算符

包含“+”、“-”、“*”、“/”、“%”等运算符,但是要注意不支持自增自减运算符:

1 num = 10
2 --下面的写法都不支持, --直接变注释了都
3 num++
4 ++num
5 num--
6 --num
7 --正确的写法如下
8 num = num + 1
9 num = num - 1

同时简写的形式也不支持:

1 num = 10
2 --简写是不支持的
3 num *= 5
4 --正确的写法如下
5 num = num * 5

取余运算支持小数,因为number类型是以double形式存在的:

1 num = 3.14
2 num = num % 1
3 print(num)--0.14

关系运算符

  • ==:判断是否相等;
  • ~=:判断是否不相等;
  • <:判断是否小于;
  • >:判断是否大于;
  • <=:判断是否小于等于;
  • >=:判断是否大于等于;

需要注意的是,table等引用类型是使用地址来进行判断的:

 1 num1 = 10
 2 num2 = 10
 3 print(num1 == num2)--true
 4
 5 str1 = "abc"
 6 str2 = "abc"
 7 print(str1 == str2)--true
 8
 9 table1 = {1, 2, 3}
10 table2 = {1, 2, 3}
11 print(table1 == table2)--false

逻辑运算符

  • and:与,等同C里的&&;
  • or:或,等同C里的||;
  • not:非,等同C里的!;

我们可以巧用逻辑运算符来实现C中的三元运算符:

1 --C 语言的写法
2 --d = a ? b : c
3 --Lua 的写法
4 d = (a and b) or c

控制结构

if then

条件判断语句,我们直接上个例子:

 1 num = math.random()
 2 print(num)
 3
 4 if num <= 0.33 then
 5   print("A")
 6 elseif num <= 0.66 then
 7   print("B")
 8 else
 9   print("C")
10 end

while和repeat

条件循环语句,while是先判断再循环,repeat是先循环再判断,例子如下:

 1 num = 10
 2
 3 --while 的条件是如果为真则继续循环
 4 while num ~= 0 do
 5   num = num - 1
 6   print(num)
 7 end
 8
 9 num = 10
10
11 --repeat 的条件是如果为真则退出循环
12 repeat
13   num = num - 1
14   print(num)
15 until num == 0

for

循环语句;

1 --步长默认为 1
2 for i = 0, 10 do
3   print(i)
4 end
5
6 --指定步长为 2
7 for i = 0, 10, 2 do
8   print(i)
9 end

foreach

迭代遍历语句,写法如下:

1 days = {"Suanday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"}
2
3 --i 表示索引, v 表示值
4 for i,v in ipairs(days) do
5   print(i, v)
6 end

break和return

用法和C中的一致,break用于跳出循环,而return用于跳出函数。

不支持的switch、case和continue

Lua中不支持switch-case语句,我们可以使用if elseif来代替;

Lua中不支持continue语句,参考下面的文件来实现:http://www.jb51.net/article/59099.htm

Lua在5.2的版本中加入了goto语句,可以用来实现continue的效果。

时间: 2024-10-11 04:01:56

Lua学习笔记(二):基本语法的相关文章

lua学习笔记之基本语法

Lua学习笔记之基本语法 1.  赋值语句 赋值是改变一个变量的值和改变表域的最基本的方法. a = "hello".."world" t.n = t.n+1 lua可以对多个变量同时赋值,变量列表和值列表的各个元素用逗号分开,赋值语句右边的值会一次赋给左边的变量. a,b = 10,2*x    <-->a = 10;b = 2*x 遇到赋值语句lua会先计算右边所有的值然后再执行赋值操纵,所以我们可以这样进行交换变量的值: x,y = y,x    

lua学习笔记(1)-基本语法

==============变量类型nilnumber(实数)    1 2 3.14 7.65e8string            "hello world" "\n"boolean(true false)    true falsefunction*userdata and threadstable(1)默认key初始化t = {a, "hello", b, "world"} (2)自定义key初始化t = {n1 =

Python学习笔记(二)Python语法_1

[[email protected] ~]# ipython In [1]: import platform In [2]: print platform.uname() ('Linux', 'kaibin.test1', '2.6.32-431.el6.x86_64', '#1 SMP Fri Nov 22 03:15:09 UTC 2013', 'x86_64', 'x86_64') In [3]: dir(platform)        #查看platform支持的功能:dir(plat

[转]LUA 学习笔记

Lua 学习笔记 入门级 一.环境配置 方式一: 1.资源下载http://www.lua.org/download.html 2.用src中的源码创建了一个工程,注释调luac.c中main函数,生成了一个exe,直接可以测试lua了 方式二(推荐): 从https://code.google.com/p/luaforwindows/ 下载“LuaForWindows_v5.1.4-46.exe”,一键安装即可  二.执行 lua xxx.lua 三.注释 1.行注释格式:-- 2.块注释格式

Lua学习笔记(六):函数-续

Lua中的函数是带有词法定界(lexical scoping)的第一类值(first-class values).第一类值指:在Lua中函数和其他值(数值.字符串)一样,函数可以被存放在变量中,也可以存放在表中,可以作为函数的参数,还可以作为函数的返回值.词法定界指:嵌套的函数可以访问他外部函数中的变量.这一特性给Lua提供了强大的编程能力. Lua中关于函数稍微难以理解的是函数也可以没有名字,匿名的.当我们提到函数名(比如print),实际上是说一个指向函数的变量,像持有其他类型的变量一样:

加壳学习笔记(二)-汇编基础

7.简单的汇编语法:   堆栈平衡  PUSH,POP功能: 把操作数压入或取出堆栈语法: PUSH 操作数 POP 操作数格式: PUSH r PUSH M PUSH data POP r POP mPUSHF,POPF,PUSHA,POPA功能: 堆栈指令群格式: PUSHF POPF PUSHA POPAADD,ADC功能: 加法指令语法: ADD OP1,OP2 ADC OP1,OP2格式: ADD r1,r2 ADD r,m ADD m,r ADD r,data影响标志: C,P,A,

Lua学习笔记9:多文件

一 终端中执行多个文件:-l 加入在文件一中定义了一个变量,在另一文件中输出这个变量,代码如下: --file1.lua num = 100 --file2.lua print(num) 终端输入(注意:不是lua命令行): lua -lfile1 -lfile2 注意:不要加上文件后缀名.lua 二 命令行中加载文件 --lib.lua function norm(x, y) local n2 = x^2 + y^2 return math.sqrt(n2) end function twic

lua学习笔记10:lua简单命令行

前面多次用了命令行,这次就好好学下命令行: 一 格式 lua [options][script][args] 二 具体命令 -e 直接将命令传个lua -l 加载一个文件 -i 进入交互模式 例如,终端输入: lua -e "print(math.sin(12))" lua学习笔记10:lua简单命令行,布布扣,bubuko.com

lua学习笔记11:lua中的小技巧

lua中的小技巧,即基础lua语言本身的特种,进行一个些简化的操作 一 巧用or x = x or v 等价于: if not x then x = v end 如果x为nil或false,就给他赋值为 二 三元运算符实现 a and b or c 类似C语言: a ? b : c and 的运算由优先级高于or lua学习笔记11:lua中的小技巧,布布扣,bubuko.com

Linux学习笔记二:Linux的文件处理命令

1.文件处理命令:ls 作用:显示目录文件 语法:ls [选项] [文件或目录] [选项]:-a 显示所有文件,包括隐藏文件   -l 显示详细信息 -d 查看目录属性 [文件或目录]:当省略时默认将当前路径作为参数 实例: · ls 显示当前文件夹下所有文件(不包括隐藏文件)的信息 · ls -l 显示当前文件夹下所有文件(不包括隐藏文件)的详细信息 · ls -ld  显示当前文件夹的详细信息 技巧:要查看文件夹的信息,必须加-d参数:要查看详细参数,必须加-l参数. 2.文件的属性 使用”