解析Lua与其他程序语言语法不同之处

移动开发 iOS
Lua与其他程序语言语法不同之处是本文要介绍的内容,主要是从LUA与其他程序语言的不同之处来学习LUA脚本语言的使用,具体内容来看本文详解。

Lua与其他程序语言语法不同之处是本文要介绍的内容,主要是从LUA与其他程序语言的不同之处来学习LUA脚本语言的使用,具体内容来看本文详解。

变量无需声明类型(variable type), 无需在首次使用前声明

以下语句是用C语言书写的.

  1. int i;  
  2. i = 9;  
  3. printf("%d\n",i); 

类似的行为在Lua中的语句是这样的:

  1. > i = 9 
  2. > print(i)  

不需要事先声明i及其类型, 可以直接使用

此外, 变量的类型也不是固定的, 是由其当前值决定的. 可以随时赋不同类型的值给同一个变量.

  1. > i = 9 
  2. > print(i)  
  3. 9  
  4. > i = "Hello Azeroth!" 
  5. > print(i)  
  6. Hello Azeroth! 

不过, 虽然使用时不需要指明, 但变量类型是存在的, 包括: number, string, Boolean, function, table, nil, thread, userdata

可以通过type语句取得类型, 如:

  1. > print(type("Hello Azeroth!"))  
  2. string 

支持为多个变量同时赋值

可使用以下的方法, 一一对应赋值:

  1. > x, y = 3, 5  
  2. > print(x * y)  
  3. 15 

[ 非的逻辑运算符是~而非! ]

  1. > print(1 ~= 3)  
  2. true 

^ 运算符为幂运算而非异或运算

即:

  1. > print(13^2) 

将得到169.

字符串的操作

可以很方便地使用tostring() / tonumber()函数进行字符串与数字类型的转换, 支持科学记数法.

  1. > x = tonumber("1e3")  
  2. > print(x)  
  3. 1000 

提供运算符 ".." 用于连接字符串, 如:

  1. > x = "a" .. "b"  
  2. > print(x)  
  3. ab 

Lua除支持双引号("")表示字符串外, 也支持用单引号('')或方括号([[]]), 以应付不同的场合, 特别是当字符串中包含有", ', ]时:

  1. > x = 'Hello' 
  2. > print(x)  
  3. Hello  
  4. > x = 'Isn't it nice?'  
  5. stdin:1: '=' expected near 'it' 

此句出错; Lua认为字符串是'Isn', 从而无法解读后面的部分; 一种解法是使用转义符. Lua和其他语言一样支持转义符:

  1. > x = 'Isn\'t it nice?'  
  2. > print(x)  
  3. Isn't it nice? 

或使用方括号:

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

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

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

方括号还支援多行字符串。

字符串长度的取法和C Shell取Table长度类似, 使用"#"运算符:

  1. > print(#"Hello")  

或者用函数string.len():

  1. > x = "Hello" 
  2. > print(string.len(x))  

逻辑运算的特殊现象

看这个语句:

  1. > print(true and 4)  

这个结果有别于其他语言, 比如C或者C++; 后者在同样的情况下会输出true(因为非0值都被当作真处理).

先来看这个问题: 在普通的逻辑表达式A and B中, 明显的, 如果第一个, 也就是A为真, 那么表达式的值是由B决定的; 即是说, A and B, 若A为真, 那么B真则表达式A and B为真, B假则表达式A and B为假.

所以Lua做出这样处理的依据是: true and 4是一个逻辑与(A and B)的表达式, 由于第一个的值为真, 表达式的值是其实是由第二个决定的; 换言之, 只要直接返回第二个表达式的值就行了. Lua的推广是, 第二个表达式即使不产生true或false的布尔值, 也可以被返回.

利用这样的运算特性, 可以在Lua内达到C/C++中a ? b : c语句的效果:

  1. > print(true and "Hello" or "Azeroth!")  
  2. Hello  
  3. > print(false and "Hello" or "Azeroth!")  
  4. Azeroth 

换言之,C/C++中的"a ? b : c"语句在Lua中可以写为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语句才能保证逻辑严密性.

(参考: 有关lua中"(a and b) or c"与C中"a?b:c"等同的条件, by carl2500 from CWDG)

变量的作用范围

Lua中可以手动划分代码块, 使用的是do-end语句:

  1. > do  
  2. >> local i = 10 
  3. >> print(i)  
  4. >> end  
  5. 10  
  6. > print(i)  
  7. nil 

和其它的程序语言使用{ }的区别不大.

小结:解析Lua与其他程序语言语法不同之处的内容介绍完了,希望通过本文的学习能对你有所帮助!

责任编辑:zhaolei 来源: 互联网
相关推荐

2021-03-09 16:38:48

加密货币比特币货币

2011-08-25 10:15:02

Lua安装函数

2010-03-10 10:58:12

python接口功能

2023-11-27 08:00:36

开发数据库查询

2012-12-11 09:16:07

Go

2009-12-15 18:47:56

Ruby框架OG

2009-08-20 10:39:00

Java与C#的不同之

2010-01-08 14:35:24

VB.NET模块

2010-04-20 16:07:25

Oracle DRCP

2012-08-23 13:36:27

2012-08-31 11:21:12

云计算大数据

2010-04-26 17:24:56

Unix操作系统

2017-03-14 15:46:30

AndroidiOS不同之处

2014-08-14 17:11:51

LinuxWindows

2009-09-25 16:13:03

Hibernate 3Hibernate2.

2023-08-10 17:23:10

LibreOfficOpenOffice

2010-09-27 10:43:35

无线路由器

2010-05-06 10:09:44

Oracle in

2021-11-14 22:06:48

JavaPython方式

2010-02-04 09:26:23

C++模板函数重载
点赞
收藏

51CTO技术栈公众号