Lua资料之基础数据类型(特殊)

◆ nil(空)
nil是一种类型,Lua将nil用于表示“无效值”。一个变量在第一次赋值前的默认值是nil,将
nil赋予给一个全局变量就等同于删除它。

local num
print(num)-->output:nil
num = 100
print(num)-->output:100

值得一提的是,OpenResty的Lua接口还提供了一种特殊的空值,即 ngx.null,用来表示
不同于nil的“空值”。

◆ 字符串:
除了单引号和双引号之外,字符串还可以用一种长括号( 即[[ ]] )括起来的方式定义。我们把两个正的方括号( 即[[ )间插入n个等号定义为第n级正长括号。就是说,0级正的长括号写作[[,一级正的长括号写作[=[,如此等等。反的长括号也作类似定义;举个例子,4级反的长括号写作]====]。一个长字符串可以由任何一级的正的长括号开始,而由第一个碰到的同级反的长括号结束。整个词法分析过程将不受分行限制,不处理任何转义符,并且忽略掉任何不同级别的长括号。这种方式描述的字符串可以包含任何东西,当然本级别的反长括号除外。例:[[abc\nbc]],里面的”\n”不会被转义。

local str1='helloworld'
local str2="hellolua"
local str3=[["add\name",'hello']]
local str4=[=[stringhavea[[]].]=]
print(str1)-->output:helloworld

print(str2)-->output:hellolua
print(str3)-->output:"add\name",'hello'
print(str4)-->output:stringhavea[[]].

注:Lua 不能通过下标来访问字符串的某个字符。

◆ table(表)
Table类型实现了一种抽象的“关联数组”。“关联数组”是一种具有特殊索引方式的数组,索引通常是字符串(string)或者number类型,但也可以是除 nil以外的任意类型的值。

local corp={
web="www.google.com",            --索引为字符串,key="web",--value="www.google.com"
telephone="12345678",           --索引为字符串
staff={"Jack","Scott","Gary"},           --索引为字符串,值也是一个表
100876,            --相当于[1]=100876,此时索引为数字,key=1,value=100876
100191,            --相当于[2]=100191,此时索引为数字
[10]=360,           --直接把数字索引给出
["city"]="Beijing"           --索引为字符串
}

print(corp.web)-->output:www.google.com
print(corp["telephone"])-->output:12345678
print(corp[2])-->output:100191
print(corp["city"])-->output:"Beijing"
print(corp.staff[1])-->output:Jack
print(corp[10])-->output:360

在内部实现上,table通常实现为一个哈希表、一个数组、或者两者的混合。具体的实现为何种形式,动态依赖于具体的table的键分布特点。

◆ 不等于:
~=

◆ 逻辑运算符

a and b 如果a为nil,则返回a,否则返回b;

a or b 如果a为nil,则返回b,否则返回a

示例:

local c = nil
local d = 0
local e =1 00

print(c and d)-->打印nil
print(c and e)-->打印nil
print(d and e)-->打印100
print(c or d)-->打印0
print(c or e)-->打印100
print(not c)-->打印true
print(not d)-->打印false

◆ 字符串连接
在Lua中连接两个字符串,可以使用操作符“..”(两个点)。如果其任意一个操作数是数字的话,Lua会将这个数字转换成字符串。注意,连接操作符只会创建一个新字符串,而不会改变原操作数。也可以使用string库函数 string.format连接字符串。

print("Hello".."World")-->打印HelloWorld
print(0..1)-->打印01
str1=string.format("%s-%s","hello","world")
print(str1)-->打印hello-world
str2=string.format("%d-%s-%.2f",123,"world",1.21)
print(str2)-->打印123-world-1.21

由于Lua字符串本质上是只读的,因此字符串连接运算符几乎总会创建一个新的(更大的)字符串。这意味着如果有很多这样的连接操作(比如在循环中使用..来拼接最终结果),则性能损耗会非常大。在这种情况下,推荐使用table和 table.concat()来进行很多字符串的拼接,例如:

local pieces={}
fori,elem in ipairs(my_list) do
    pieces[i]=my_process(elem)
end
local res=table.concat(pieces)

猜你喜欢

转载自blog.csdn.net/sky6even/article/details/81709451