Lua语法和使用基础

来源:互联网 发布:钢筋算量是怎么算法的 编辑:程序博客网 时间:2024/06/13 00:59

1.语法注释

单行注释中,连续两个减号"--"表示注释的开始,一直延续到行末为止。

多行注释中,由"--[["表示注释开始,并且一直延续到"]]"为止。

在Lua中,语句之间可以用分号";"隔开,也可以用空白隔开。一般来说,如果多个语句写在同一行的话,建议总是用分号隔开。

2.语句块

在Lua中,它是用do 和 end 括起来的。比如:

doprint("Hello")print("Hello123")end

3.赋值语句

在默认情况下,变量总是认为是全局的,局部变量需要用local定义。赋值语句在Lua被强化了。它可以同时给多个变量赋值。

a, b, c = 1, 2, 3a, b = b, alocal c =1 --局部变量

4.数值运算

和C语言一样,支持 +, -, *, /。但Lua还多了一个"^"。这表示指数乘方运算。连接两个字符串,可以用".."运处符。

比较运算符有:<(小于) 、>(大于)、<=(小于等于)、>=(大于等于)、==(等于)、~=(不等于)

取字符串长度运算符“#”:count = #(string)

对于Table,Function和Userdata类型的数据,只有 == 和 ~=可以用。相等表示两个变量引用的是同一个数据。比如:

a={1,2}b=a print(a==b, a~=b)  --输出 true, falsea={1,2}b={1,2} print(a==b, a~=b)  --输出 false, true

5.逻辑运算

and, or, not

x = a and b  <==>  a == false x = a else x = b 

x = a or b <==> a == true x = a else x = b

总结:and就是一假则假,or是一真则真。这和其他语言解释是相通的,不同的是相反情况下,其他语言会再次判断第二个条件,而lua会不管第二个操作符真假而直接返回。

false = not true

我们可以模拟C语言中的语句:x = a? b : c,在Lua中,可以写成:x = a and b or c

但是这个语句是有缺陷的,在a and b or c中, 通常a是逻辑表达式, b和c不会是表达式, 首先运算a and b, 然后是(a and b) or c. 正常情况下, 若a为真, a and b会返回b, 如果b是一个字串或数值, 它就是'真', 因此b or c会直接返回b, 符合预期的"a为真, 返回b"的设计。
但如果b是一个变量, 而该变量恰好为空(如尚未定义)时, b为假, b or c就会返回c. 此时产生了"a为真, 但返回c"的情况。
因此为了使表达式a and b or c正常工作, 必须保证b为真. 在不能保证b为真的情况下, 只有用if-else语句才能保证逻辑严密性。

最有用的语句是: x = x or v,它相当于:if not x then x = v end 

6.关键字

andbreakdoelseelseifendfalseforfunctionifinlocalnilnotorrepeatreturnthentrueuntilwhile   

7.变量类型

怎么确定一个变量是什么类型的呢?可以用type()函数来检查。Lua支持的类型有以下几种:

Nil空值,所有没有使用过的变量,都是nil。nil既是值,又是类型。Boolean布尔值,只有两个有效值:true和false Number数值,在Lua里,数值相当于C语言的doubleString字符串,如果你愿意的话,字符串是可以包含"\0"字符的
(这和C语言总是以"\0"结尾是不一样的)Table关系表类型,这个类型功能比较强大Function函数类型,函数也是一种类型,也就是说,所有的函数,它本身就是一个变量。Userdata这个类型专门用来和Lua的宿主打交道的。宿主通常是用C和C++来编写的,
在这种情况下,Us是宿主的任意数据类型,常用的有Struct和指针。Thread线程类型,在Lua中没有真正的线程。Lua中可以将一个函数分成几部份运行。

8.控制语句

if 条件 then ... elseif 条件 then ... else ... end

if 1+1=2 then print("true") elseif 1+2~=3 then print("true") else print("false") end
while 条件 do ... end
while 1+1~=2 do print("true") end
repeat ... until 条件
repeat print("Hello") until 1+1~=2

for 变量=初值, 终点值, 步进 do ... end

for i = 1, 10, 2 doprint(i)end
for 变量1, 变量2, ... 变量n in 表或枚举函数 do ... end

for a,b in mylist doprint(a, b)end
for的循环变量总是只作用于for的局部变量;当省略步进值时,for循环会使用1作为步进值,使用break可以用来中止一个循环。

9.转义字符

和C语言相同的,它支持一些转义字符,列表如下:

\a  bell

\b  back space

\f  form feed

\n  newline

\r  carriage return

\t  horizontal tab

\v  vertical tab

\\  backslash

\"  double quote 

\‘ single quote

\[  left square bracket 

\]  right square bracket 

在Lua中,可以用另一种表示方法:用"[["和"]]"将多行的字符串括起来。例如

> x = [[This is a long string including ' and "]]
> print(x)
This is a long stirng including ' and "

方括号的配对规则是: 在[ [之间可以没有等号(上面的情形), 或者有任意数量的等号, 配对时将寻找包含相同数量等号的] ]. 例如:

> x = [==[This is a long string including ', ]] and "]==]
> print(x)
This is a long string including ', ]] and "

10.用gcc编译c与lua的交互程序

lua的安装目录:

lua.h lualib.h lauxlib.h所在目录为/usr/local/include/

liblua.a链接库所在目录为/usr/local/lib/

c程序源代码文件为testlua.c

gcc命令:gcc -o testlua testlua.c [-I /usr/local/include/ -L /usr/local/lib] -llua -ldl -lm

解析:

-I /usr/local/include/ -L /usr/local/lib为指定.h和静态库文件的路径,默认gcc会把此目录包含为索引目录,所以此项可以省略

-llua 连接名为lua的静态库-文件名为liblua.a

作用是提供3个头文件中函数的实现代码让链接器去连接

-ldl 连接名为dl的动态库-文件名为libdl.so 

作用是提供了dlopen,dlclose,dlsym,dlerror四个方法,它们是实现应用程序运行时动态加载库;这里加载它的原因是liblua.a的实现中使用了这里面的方法调用了系统的标准动态库。

-lm 连接了名为m的动态库-文件名为libm.so

作用是提供数学库的支持,也是lua库中需要的


0 0
原创粉丝点击