Lua运算符

  • 运算符是一个特殊的符号,用于告诉解释器执行特定的数学或逻辑运算。Lua提供了以下几种运算符类型:算术运算符、关系运算符、逻辑运算符、其他运算符。
算术运算符

设定 A 的值为15,B 的值为 20。

操作符

描述

实例

+

加法

A + B 输出结果 35 integer

-

减法

A - B 输出结果 -5 integer

*

乘法

A * B 输出结果 300 integer

/

除法

A / B 输出结果 0.75 float 。4/2结果2.0

%

取余

B % A 输出结果 5 integer

//

取商

B // A 输出结果 1 integer

^

乘幂

A^2 输出结果 225.0 float

-

负号

-A 输出结果v -15 integer

  • **如果想要区分整型值和浮点型值,**可以使用 math.type() 函数
  • Lua 5.3引入整型的主要建议是:开发人员要么选择忽略整型和浮点型二者之间的不同,要么就完整地控制每一个数值的表示。因此, 所有的算术操作符不论操作整型值还是浮点型值,结果都是一样的
  • 如果两个操作数都是整型值,则结果也是整型值;否则就是浮点型值 ,当两个操作数的类型不同时,运算之前会先将整型值转换为浮点型值。
关系运算符

操作符

描述

==

等于,检测两个值是否相等,相等返回 true,否则返回 false

~=

不等于,检测两个值是否相等,相等返回 false,否则返回 true<

>

大于,如果左边的值大于右边的值,返回 true,否则返回 false

<

小于,如果左边的值大于右边的值,返回 false,否则返回 true

>=

大于等于,如果左边的值大于等于右边的值,返回 true,否则返回 false

<=

小于等于, 如果左边的值小于等于右边的值,返回 true,否则返回 false

  • Lua关系运算的结果都是boolean类型
  • ==、~=说明: 这两个运算符可以应用于任意两个值, 当这两个值的类型不同时,Lua语言认为它们是不相等的 ;否则,会根据它们的类型再对两者进行比较
  • 比较数值时永远忽略数值的子类型, 数值究竟是以整型还是浮点型表示并无区别,只与算术值有关(尽管如此,比较具有相同子类型的数值时效率更高)
逻辑运算符

操作符

描述

and

逻辑与操作符。 如果两边的操作都为 true 则条件为 true。

or

逻辑或操作符。 如果两边的操作任一一个为 true 则条件为 true。

not

逻辑非操作符。与逻辑运算结果相反,如果条件为 true,逻辑非为 false。

其他运算符

操作符

描述

实例


连接两个字符串

a…b ,其中 a 为 "Hello " , b 为 “World”, 输出结果为 “Hello World”。

#

一元运算符,返回字符串或表的长度。

#“Hello” 返回 5

运算符优先级

从高到低:

^ 
     一元运算符 (not   #     -     ~)
     *     /     //    %
     +     -
     ..
     <<    >>
     &
     ~
     |
     <     >     <=    >=    ~=    ==
     and
     or

除了^和…外所有的二元运算符都是左连接的。

a+i < b/2+1          <-->       (a+i) < ((b/2)+1)
5+x^2*8              <-->       5+((x^2)*8)
a < y and y <= z     <-->       (a < y) and (y <= z)
-x^2                 <-->       -(x^2)
x^y^z                <-->       x^(y^z)

Lua字符串

  • Lua语言中的字符串 是一串字节组成的序列。 在Lua语言中, 字符使用8个比特位来存储
  • Lua语言中的字符串 可以存储包括空字符在内的所有数值代码 ,这意味着我们可以在字符串中存储任意的二进制数据
  • 我们也 可以使用任意一种编码方式(UTF-8、UTF-16等)来存储Unicode字符串
字符串常量
  • 可以使用一对双引号或者单引号来声明字符串常量
a =  'string'
a =  "string"
  • 双引号和单引号声明字符串是等价的, 引号内的另一种引号不会转义
a =  'this is a "string"'
a =  "this is a 'string'"
转义字符

转义字符

意义

ASCII码值(十进制)

\a

响铃(BEL)

007

\b

退格(BS) ,将当前位置移到前一列

008

\f

换页(FF),将当前位置移到下页开头

012

\n

换行(LF) ,将当前位置移到下一行开头

010

\r

回车(CR) ,将当前位置移到本行开头

013

\t

水平制表(HT) (跳到下一个TAB位置)

009

\v

垂直制表(VT)

011

\

代表一个反斜线字符’’’

092


代表一个单引号(撇号)字符

039

"

代表一个双引号字符

034

空字符(NULL)

000

\ddd

1到3位八进制数所代表的任意字符

三位八进制

\xhh

1到2位十六进制所代表的任意字符

二位十六进制

字符串长度
  • 可以使用长度操作符#获取字符串的长度
a = "hello"
print(#a)				-- 5
print(#"hello world")	-- 11
字符串拼接
  • 可以使用连接操作符..来进行字符串连接
  • 如果操作数中有数值,那么会把数值转换为字符串。数字后面使用连接符时,必须要用一个空格隔开,否则Lua会把数字后面的第一个.当成小数点。
  • 在Lua中,字符串是不可变变量。字符串连接总是创建一个新字符串,而不会改变原来操作数的字符串。
"aa"..3 .."bb" --aa3bb
多行字符串
  • 像常长注释/多行注释一样,可以使用一对双方括号来声明长字符串/多行字符串常量
page = [[
<html>
<head>
    <title> An HTML Page</tile>
</head>
<body>
    <a href="http://www.lua.org">Lua</a>
</body>
</html>
]]

-- 多行字符串的换行有效,换行符\n不会被转义
特殊字符串声明

如下特殊字符串会出现问题:

string = [[
    Hello
    -- [[ 注释 ]]
    World
]]
string = "a=b[c[i]]"

print(string)
  • 为了应对这种情况, 可以在左方括号之间加上任意数量的等号 例如[===[string]===]时才会结束
  • **对于注释而言,这种机制也同样使用,**例如可以使用--[=[]=]来表示长注释
字符串操作

Lua 提供了很多的方法来支持字符串的操作:

序号

方法 & 用途

1

string.upper(argument): 字符串全部转为大写字母。

2

string.lower(argument): 字符串全部转为小写字母。

3

string.gsub(mainString,findString,replaceString,num) 在字符串中替换,mainString为要替换的字符串, findString 为被替换的字符,replaceString 要替换的字符,num 替换次数(可以忽略,则全部替换),如:

> string.gsub("aaaa","a","z",3); zzza 3

4

string.find (str, substr, [init, [end]]) 在一个指定的目标字符串中搜索指定的内容(第三个参数为索引),返回其具体位置。不存在则返回 nil。

> string.find("Hello Lua user", "Lua", 1) 7 9

5

string.reverse(arg) 字符串反转

> string.reverse("Lua") auL

6

string.format(…) 返回一个类似printf的格式化字符串

> string.format("the value is:%d",4) the value is:4

7

string.char(arg) 和 string.byte(arg[,int]) char 将整型数字转成字符并连接, byte 转换字符为整数值(可以指定某个字符,默认第一个字符)。

> string.char(97,98,99,100) abcd> string.byte("ABCD",4) 68

> string.byte("ABCD") 65

8

string.len(arg) 计算字符串长度。

string.len("abc") 3

9

string.rep(string, n)) 返回字符串string的n个拷贝

> string.rep("abcd",2) abcdabcd

10

链接两个字符串

> print("hello".."world") helloworld

11

string.sub(s, i, j) :从字符串s中提取第i个到第j个字符(包括i和j),索引从1开始。如:

> string.sub("HelloWorld", 1, 3) Hel

12

string.format() : 格式化的输出,类似于C语言的print()函数

Lua数组

  • Lua 数组其实就是使用整数作为索引的表,数组的大小不是固定的, nil来标记列表的结束
  • 在Lua语言中, 数组索引一般从1开始 (而不是像C语言一样从0开始),Lua中的其它许多机制也遵循这个管理
一维数组

一维数组是最简单的数组,其逻辑结构是线性表。一维数组可以用for循环出数组中的元素,如下实例

a = {}
 
-- 先输入5个元素
for i = 1, 5 do
    a[i] = io.read()
end
 
-- 打印5个元素
for i = 1, 10 do
    print(a[i])
end
多维数组

多维数组即数组中包含数组或一维数组的索引键对应一个数组。

以下是一个三行三列的阵列多维数组:

-- 初始化数组
array = {}
for i=1,3 do
   array[i] = {}
      for j=1,3 do
         array[i][j] = i*j
      end
end

-- 访问数组
for i=1,3 do
   for j=1,3 do
      print(array[i][j])
   end
end

不同索引键的三行三列阵列多维数组:

-- 初始化数组
array = {}
maxRows = 3
maxColumns = 3
for row=1,maxRows do
   for col=1,maxColumns do
      array[row*maxColumns +col] = row*col
   end
end

-- 访问数组
for row=1,maxRows do
   for col=1,maxColumns do
      print(array[row*maxColumns +col])
   end
end

结果均为:

1
2
3
2
4
6
3
6
9