lua学习一

Lua语言本身以简单优雅为本,处理C不擅长的任务。

Lua本身完全遵循ANSI C而写成,只要有C编译器的地方,Lua便可发挥她的力量。

Lua是一种易扩展的语言,也是一种易整合语言。

特征:

1、可扩展性。易于C/C++、java、fortran、Smalltalk、Ada以及其他语言接口

2、简单。内容少但功能强大

3、高效性。

4、与平台无关。

全局变量

访问没有初始值的全局变量不会报错,只不过得到的结果是:nil。

print(b)          ----> nil

b = 10

print(b)          -----> 10

词法约定

标示符:字母或者下划线开头的字母,下划线,数字序列,最好不用下划线加大写字母的标示符。

保留字:and、break、do、else、if、function等等

Lua是大小写敏感的。

注释:单行注释--

多行注释 --[[ --]]

命令行方式

lua [optins] [script [args] ]

options

-e 直接将命令传入Lua

-l 加载一个文件

-i 进入交互模式

-PROMPT内置变量作为交互模式的提示符

类型和值

Lua是动态类型语言,变量不要类型定义。

8个基本类型:nil、boolean、number、string、userdata、function、thread和table

nil:特殊类型,全局变量没有赋值以前默认为nil,给全局变量赋nil可以删除该变量

boolean:false和true,在控制结构的条件中除了false和nil为假,其他值都为真,所以0和空串都为真

number:实数,lua中没有整数。

string:字符的序列,lua是8位字节,所有字符串可以包含任何数值的字符,包括嵌入0

string和其他对象一样,lua自动进行内存分配和释放,一个string可以包含一个字母,也可包含一本书

使用单引号或者双引号表示字符串

转译字符:

\a bell

\b        ---后退

\f        ---换页

\n        ---换行

\r         ---回车

\t        ---制表

\v

\\        ---"\"

\"        ---双引号

\'        ---单引号

\[        ---左中括号

\]        ---右中括号

[[ ... ]]表示字符串,字符串可以包含多行,可以嵌套且不会解释转义序列

Lua会自动在string和number之间自动进行类型转换,当一个字符串使用算术操作时,string会被转成数字

..在lua中是字符串连接符

当在一个数字后面写..时,必须加上空格,防止被解释错

字符串和数字可以自动转换,但是两者也有不同,当 10 == ‘10’比较永远是错的。

如果需要显示将string转化成数字,可以使用头number(),如果string不是正确的数字该函数将返回nil

function

函数是第一类值,意味可以将函数存放到变量中,可以作为函数的参数,也可以作为函数的返回值。

userdata可以将C数据存放在lua变量中,除了赋值和相等比较外,没有预定义的操作。

表达式

算术运算符

二元运算符:+、-、*、/、^(加减速除密)

一元运算符:-(负值)

这些运算符的操作数都是实数

关系运算符

<、>、<=、>=、==、~=

返回结果为false或者true;==和~=比较两个值,如果类型不同,Lua任务两者不同,nil只和自己相等

混合比较数字和字符串,lua会报错

逻辑运算符

and、or、not

逻辑运算符任务false和nil是假,其他都为真,0为真

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

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

a or b --如果a为false,则返回b,否则返回a

and 的优先级比or高

not的结果是返回false或者true

连接运算符

.. --两个点

如果操作数是数字,lua将数字转化成字符串。

优先级

从高到底的顺序

^

not、-(unary)

*、/

+、-

..

<、>、<=、>=、==、~=

and

or

表的构造

构造器是创建和初始化表的表达式

最简单的构造函数是{},用来创建一个空表。可以直接初始化为数组。

days = {"Sunday", "Monday", "Tuesday", "Wednesday","Thursday", "Friday", "Saturday"}

Lua将"Sunday"初始化days[1](第一个元素索引为1)

print(days[4]) --> Wednesday

构造函数可以使用任何表达式初始化:

tab = {sin(1), sin(2), sin(3), sin(4),sin(5),sin(6), sin(7), sin(8)}

如果想初始化一个表作为record使用可以这样:

a = {x=0, y=0}  <-->  a = {}; a.x=0; a.y=0   两种表示作用相同

不管用何种方式创建table,我们都可以向表中添加或者删除任何类型的域,构造函数仅仅影响表的初始化。

在同一个构造函数中可以混合列表风格和record风格进行初始化

polyline = {

color="blue", thickness=2, npoints=4,
{x=0, y=0},
{x=10, y=0},
{x=-10, y=1},
{x=0, y=1}
}

print(polyline[2].x) --> 10

基本语法

赋值语句

赋值是改变一个变量的值和改变表域的最基本的方法

Lua可以对多个变量同时赋值,变量列表和值列表的各个元素用逗号分开,赋值语句右边的值会依次赋给左边的变量。

a, b = 10, 2*x <--> a=10; b=2*x

遇到赋值语句Lua会先计算右边所有的值然后再执行赋值操作,可以进行交换变量的

x, y = y, x -- swap 'x' for 'y'
a[i], a[j] = a[j], a[i] -- swap 'a[i]' for 'a[i]'

当变量个数和值的个数不一致

a. 变量个数>值的个数按变量个数补足nil
b. 变量个数<值的个数多余的值会被忽略

局部变量

使用local创建局部变量,与全局变量不同,局部变量只在声明的代码块中有效

代码块:指一个控制结构内,一个函数体,或者一个chunk(变量被声明的那个文件或者文本串)。

控制语句

控制结构的条件可以是任何值。Lua任务false和nil是假,其他的都真

if语句三种模式

if conditions then

   then-part

end;

if conditions then

   then-part

else

   then-part

end;

if conditions then

   then-part

elseif conditions then

   elseif-part

   ...

else

   else-part

end;


while语句

while condition do

   statements

end;


repeat-until语句

repeat

   statements

until   conditions;

for循环有两类

一类数值for循环

for var=exp1,exp2,exp3 do

   loop-part

end

or将用exp3作为step从exp1(初始值)到exp2(终止值),执行loop-part。其中exp3可以省略,默认step=1

1. 三个表达式只会被计算一次,并且是在循环开始前。

2. 控制变量var是局部变量自动被声明,并且只在循环内有效.

3. 循环过程中不要改变控制变量的值,那样做的结果是不可预知的。如果要退出循环,使用break语句。

二类范型for循环

for i,v in ipairs(a) do print(v) end

范型for遍历迭代子函数返回的每一个值。

范型for和数值for有两点相同:
1. 控制变量是局部变量
2. 不要修改控制变量的值

break和return语句

break语句用来退出当前循环(for,repeat,while)。在循环外部不可以使用。
return用来从函数返回结果,当一个函数自然结束结尾会有一个默认的return。(这种函数类似pascal的过程)

函数

函数有两种用途:

1.完成指定的任务,这种情况下函数作为调用语句使用;

2.计算并返回值,这种情况下函数作为赋值语句的表达式使用。

function func_name (arguments-list)
     statements-list;
end;

调用函数的时候,如果参数列表为空,必须使用()表明是函数调用

当函数只有一个参数并且这个参数是字符串或者表构造的时候,()是可选

print "Hello World" <--> print("Hello World")

Lua也提供了面向对象方式调用函数的语法,比如o:foo(x)与o.foo(o, x)是等价的

Lua函数实参和形参的匹配与赋值语句类似,多余部分被忽略,缺少部分用nil补足。

function f(a, b) return a or b end

f(3) a=3, b=nil
f(3, 4) a=3, b=4
f(3, 4, 5) a=3, b=4 (5 is discarded)

返回多个结果值

Lua函数可以返回多个结果值,比如string.find,其返回匹配串“开始和结束的下标”

s, e = string.find("hello Lua users", "Lua")
print(s, e) --> 7 9

Lua函数中,在return后列出要返回的值得列表即可返回多值

Lua总是调整函数返回值的个数去适用调用环境,当作为一个语句调用函数时,所有返回值被忽略

第一,当作为表达式调用函数时

1. 当调用作为表达式最后一个参数或者仅有一个参数时,根据变量个数函数尽可能多地返回多个值,不足补nil,超出舍去。
2. 其他情况下,函数调用仅返回第一个值(如果没有返回值为nil)

一个return语句如果使用圆括号将返回值括起来也将导致返回一个值

函数多值返回的特殊函数unpack,接受一个数组作为输入参数,返回数组的所有元素

可变参数

Lua函数可以接受可变数目的参数

Lua将函数的参数放在一个叫arg的表中,除了参数以外,arg表中还有一个域n表示参数的个数

printResult = ""
function print(...)
for i,v in ipairs(arg) do
printResult = printResult .. tostring(v) .. "\t"
end
printResult = printResult .. "\n"
end

命名参数

Lua的函数参数是和位置相关的,调用时实参会按顺序依次传给形参。有时候用名字指定参数是很有用的

Lua可以通过将所有的参数放在一个表中,把表作为函数的唯一参数来实现上面这段伪代码的功能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值