Lua语法和使用基础
2015-01-13 11:42
465 查看
1.语法注释
单行注释中,连续两个减号"--"表示注释的开始,一直延续到行末为止。多行注释中,由"--[["表示注释开始,并且一直延续到"]]"为止。
在Lua中,语句之间可以用分号";"隔开,也可以用空白隔开。一般来说,如果多个语句写在同一行的话,建议总是用分号隔开。
2.语句块
在Lua中,它是用do 和 end 括起来的。比如:do print("Hello") print("Hello123") end
3.赋值语句
在默认情况下,变量总是认为是全局的,局部变量需要用local定义。赋值语句在Lua被强化了。它可以同时给多个变量赋值。a, b, c = 1, 2, 3 a, b = b, a local c =1 --局部变量
4.数值运算
和C语言一样,支持 +, -, *, /。但Lua还多了一个"^"。这表示指数乘方运算。连接两个字符串,可以用".."运处符。比较运算符有:<(小于) 、>(大于)、<=(小于等于)、>=(大于等于)、==(等于)、~=(不等于)
取字符串长度运算符“#”:count = #(string)
对于Table,Function和Userdata类型的数据,只有 == 和 ~=可以用。相等表示两个变量引用的是同一个数据。比如:
a={1,2} b=a print(a==b, a~=b) --输出 true, false a={1,2} b={1,2} print(a==b, a~=b) --输出 false, true
5.逻辑运算
and, or, notx = 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.关键字
and | break | do | else | elseif | end |
false | for | function | if | in | local |
nil | not | or | repeat | return | then |
true | until | while |
7.变量类型
怎么确定一个变量是什么类型的呢?可以用type()函数来检查。Lua支持的类型有以下几种:Nil | 空值,所有没有使用过的变量,都是nil。nil既是值,又是类型。 |
Boolean | 布尔值,只有两个有效值:true和false |
Number | 数值,在Lua里,数值相当于C语言的double |
String | 字符串,如果你愿意的话,字符串是可以包含"\0"字符的 (这和C语言总是以"\0"结尾是不一样的) |
Table | 关系表类型,这个类型功能比较强大 |
Function | 函数类型,函数也是一种类型,也就是说,所有的函数,它本身就是一个变量。 |
Userdata | 这个类型专门用来和Lua的宿主打交道的。宿主通常是用C和C++来编写的, 在这种情况下,Us是宿主的任意数据类型,常用的有Struct和指针。 |
Thread | 线程类型,在Lua中没有真正的线程。Lua中可以将一个函数分成几部份运行。 |
8.控制语句
if 条件 then ... elseif 条件 then ... else ... endif 1+1=2 then print("true") elseif 1+2~=3 then print("true") else print("false") endwhile 条件 do ... end
while 1+1~=2 do print("true") endrepeat ... until 条件
repeat print("Hello") until 1+1~=2
for 变量=初值, 终点值, 步进 do ... end
for i = 1, 10, 2 do print(i) endfor 变量1, 变量2, ... 变量n in 表或枚举函数 do ... end
for a,b in mylist do print(a, b) endfor的循环变量总是只作用于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库中需要的
相关文章推荐
- Lua 基础语法|特性使用集合
- CodeSmith使用基础教程 三 — 语法与对象
- CodeSmith使用基础教程 三 — 语法与对象
- JSP基础语法之一:Scriptlet使用、简单的JSP获取表单数据再输出表格
- XPath可以快速定位到Xml中的节点或者属性。XPath语法很简单,但是强大够用,它也是使用xslt的基础知识。
- 块语法block 在iOS4中使用代码块-基础知识(翻译)
- 入门系列之二PHP基础语法:if 语句的使用
- Java语法基础之函数的使用说明
- 【Cocos2dX(2.x)_Lua开发之三】★重要必看篇★在Lua中使用自定义精灵(Lua脚本与自创建类之间的访问)及Lua基础讲解
- XPath可以快速定位到Xml中的节点或者属性。XPath语法很简单,但是强大够用,它也是使用xslt的基础知识。
- 浅析C# 基础语法的使用
- CodeSmith使用基础教程 二 — 语法、标签
- 笔记: Lua基础: 特殊的程序语法
- 语法基础: 使用不同的数据类型标记数组
- 块语法block 在iOS4中使用代码块-基础知识(翻译)
- CodeSmith使用基础教程 二 — 语法、标签
- CodeSmith使用基础教程 (3) — 语法与对象
- lua学习笔记(1) --Lua基础语法
- JSP基础语法之十六:JSTL配置和核心标签(C)的使用
- Lua脚本之语法基础快速入门