Lua学习一

1.Lua是一种易于扩展的语言,也是一种易于整合的语言,设计之初,Lua就是瞄准补充其他基本高级编程语言如C/C++而来。不过,Lua除了能整合组件,同时还能编辑组件甚至自行创建组件。

2.Lua跟Python的区别,函数定义,代码段均是通过缩进来完成,不同的是,Python需要使用冒号,而Lua则是与MATLAB相似的使用end

3.Lua跟Python一样,不限定分号,但是如果多条语句处于同一行的话,最好用分号隔开。

4.Lua讲究Chunk,一个Chunk可以是一个文件,也可以是交互执行模式下的一行语句(不一定是一条)

5.Lua也是一种动态语言,其中的变量跟python一样,都不需要声明,在打印未初始化变量时,返回的不是None,而是nil,全局变量未赋值前均为nil,而给全局变量赋nil可以删除全局变量。Lua中变量的类型可以通过type函数返回(type("hello world"): string)

6.Lua的注释方式:

- -:单行注释

- -[[ some comments- -]]:多行注释

此外,Lua也可以用[[...]]来表示字符串,这种字符串可以覆盖多行,且不需要考虑到转义字符(即不做解释,直接输出),不过如果第一个字符是换行符,则会自动被忽略

7.Lua中的布尔变量:false和true,跟python不同,Lua中除了false和nil是false之外,其余任何值包括0和空串都会被看成true,同样,跟Python不同的是,Lua中没有整数和浮点数的区别,所有的数字类型统统为number

8.当Lua使用字符串进行算术操作时,会自动将字符串转换为数字:

print("10"+1) : 11

print("2"*"2") : 4

print("2"+"2") : 4

这与python中部分算术运算不同:

>>>print "2"*3 : 222

>>>print "2"+"2" : 22

虽然如此,但如果比较2=="2"的返回结果却总是false

9.Lua的输入语句line = io.read() --读入一行;n = tonumber(line) --将之转换为数字;s = tostring(n) --将之转换为字符串(Lua的字符串通python一样不可修改),而输出方式为:io.write(string),string.format(a,b,c...)(省略号表后面还可以继续添加参数)用于将参数表中的若干参数合并成一个字符串

10.Python中乘方为**,而^表示按位异或,在Lua中^表示乘方

11.python中不等号!=,<>,而Lua中,不等号~=,此外,nil只和自己相等,这个倒是与Python相似(此外,在Lua中不能直接给出表达式让其输出结果:2*3,会报错,而python则可以将值输出)

12.Python中可以进行数字和字符串之间的混合比较(会将字符串第一个字符的ascii值取出进行比较):2<"1" #true,而Lua进行比较则会报错:print(2<"2") --error

13.与python一样,Lua的and和or逻辑操作返回的值不一定是true或false,其规则如下:

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

a or b : 如果a为true,则返回a,否则如果a为nil或者false,则返回b值:2 or 3 -- 2,;false or 3 -- 3

14.字符串连接符(两点): .. ,记得前后各空一格,如果前后参数存在数字,则自动转化为字符串

print(2 .. 4) -- 24

15.Lua中算术运算符优先级:^ 》 not == - 》* == / 》+ == - 》.. 》 > == < == >= == <= == == == ~= 》and 》 not,除了乘方运算符^,所有的算术运算符都是左连接的,即从左往右进行运算,x^y^z == x^(y^z)

16.Lua提供了一种称之为构造器的工具,用来创建表,这个表跟Python中的列表有点像,但是功能更强大,可以将字典的功能也包含进去:

days={"Monday","Tuesday","Wednesday"} --创建了一个表,类似于列表list,不过是从1开始计数,days[1] : "Monday"

a={x=0,y=0} -- 创建了一个类似于字典的表(称为record风格),其作用相当于

a={},a.x=0,a.y=0 --不需要事先定义或确定其中的变量名字,直接修改,如果不存在则添加

从标准输入行读入每行,然后反序形成列表:

<span style="font-family:SimHei;font-size:14px;">list = nil
for line in io.lines() do
    list = {next = list, value = line}
end</span>
输出:

<span style="font-family:SimHei;font-size:14px;">l = list
while l do
    print(l.value)
    l = l.next
end</span>
17.此外,还可以嵌套构造表,而且可以使用列表风格和record风格混搭构造:

polyline = { color = "blue", thickness = 2, npoints = 4; {x=0,y=0},{x=-10,y=0},{x=43,y=24}}

可以看到,前三个是record 风格,而后三个则是列表风格,此时,print(polyline[1].x 的输出结果为0,,因为下标索引只计算列表风格项,而record风格项则直接通过变量名访问(相邻项之间除了用逗号隔开,还可以用分号,常常用分号将不同块的元素项分开)

18.使用列表风格构造表时,除了默认的方式,给出下标都是从1开始,也可以自定义下标(有点类似于枚举方法):

<span style="font-family:SimHei;font-size:14px;">> opnames = {["+"] = "add", ["-"] = "sub",["*"]="mul",["/"]="div"};
> i=20;
> a={[i+0] = "abc",[i+2] = "cde", [i+5] = "fgh"}
> print(opnames["+"])
add
> print(a[22])
cde</span>
18.Lua赋值:a,b=c,d; a,b,c = d,e --c会被赋值nil;a,b = c,d,e -- e会被忽略,而在python中则必须匹配变量名和变量个数,否则会报错
<span style="font-family:SimHei;font-size:14px;">> a=3
> b=4
> c=5
> d=56
> e=32
> a,b,c=d,e
> print(a,b,c)
56      32      nil
></span>
19.代码块中的局部变量:

<span style="font-family:SimHei;font-size:14px;">> x=10
> local i = 1    --此处新定义了一个chunk,而此chunk的作用域仅限于此语句(类似于C++中没有添加花括号)
> while i <= x do
>>      local x = i*2
>>      print(x)   --此处在交互式环境中,将不能得到正确的输出,因为作为循环条件的变量i在交互式环境中的作用域仅限于其定义的语句
>>      i = i+1
>> end
>
> if i > 20 then
>> local x  --此处新定义了一个局部变量,其作用域仅限于整个then语句范围,即抵达else语句之前
>> x = 20
>> print(x+2)
>> else
>> print(x) --此处的x是全局变量x
>> end
10</span>

20.跟Python不同,Lua提供了一种类似C++中设定代码块的方式(即C++中的花括号框住的作用域):

do

...

end

21.Python中的条件语句:

if conditions :

...

elif conditions :

...

else :

...

Lua中的条件语句:

if conditions then

...

elseif conditions then

...

else

...

end

22.Lua中除了while do end, for do end循环之外,还提供了一种特殊的循环语句:

repeat

...

until

这种循环语句的作用类似于C++中的do while循环,在Lua中,三种循环语句都可以通过break的方式跳出。

范型for循环:

for i in a do

...

end

这类for循环中一般i是临时定义的局部变量,不需要额外修改循环计数变量的值

23.在Lua中一般有两种方式可以直接终止循环:break和return。前一种可以直接跳出循环,而后一种则是直接跳出函数。不过对于这两种方式都有一个限制,即break或return语句都必须只能出现在一个chunk的最末尾处,即在end,until或者else正前一句,有时候为了在chunk中跳出,则需要借用语句块do end来实现

24.函数使用时,一般必须要加括号,即使没有参数也如此,除了一种情况,即如果函数只有一个参数,且参数的类型是字符串或者表构造,那么可以省略括号直接使用,不过不推荐这种方式

25.面向对象的函数调用(成员函数)有两种方式o.f(a,b) == o:f(a,b)

26.Lua函数调用时形参与实参匹配过程同多值赋值语句类似,超出部分被忽略,欠缺部分补上nil

27.Lua中函数可以返回多值,return a,b多值之间只需用逗号隔开即可,而Python中则是需要将多值构成一个元组返回

28.Lua中的函数指针定义,不需要添加括号:f=string.find,Python中也是如此,不用添加括号

29.Lua中有一个函数unpack可以用来将表(或数组)逐个元素逐个元素拆分开来,一般用作参数可变函数调用中:

f = string.find; f(unpack(a))

30.Lua中跟C中一样,可以定义参数个数可变的函数,一般在函数形参处用三点省略号代替(另外,也可以先列出若干普通形参,后接三点省略号表示必须参数和可选参数),而在函数内部,用arg来表示整个参数列表(数组),而通过arg[m]可以取出第n个元素,常常采用这种方式来实现灵活调用

31.Lua中有一个ipairs函数,可以返回三个参数,分别是迭代器,迭代器所指的值以及0,此函数一般用于数组(列表)的调用,遇到nil则退出,而此外还有一个pairs函数,同样也返回三个值,分别是next函数返回值,next返回值对应的record(表)值以及nil,一般用于表构造的迭代输出,之所以ipairs不能用于表构造的迭代,是因为表构造有时候可能存在着不连贯的跳跃,在这种情况下,迭代器所对应的值为nil,此时就会跳出不再循环迭代,详情参见:http://blog.csdn.net/witch_soya/article/details/7556595

32.在函数有多个返回值的时候,如果只想取用其中的若干个,而忽略其他,则可以将需要的返回值前方的所有不需要的位置处用一个下划线代替,这种方式称为哑元返回

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值