小白新学,所有资料源于互联网 此处,仅为记录
Lua中的数据类型
Lua 是动态类型语言 类似JS不需类型的定义,只需要直接赋值。
Lua 中有7种基本数据类型:nil,boolean,number,string,usedata,function,thread,table。
userdata thread table 和Java不同的地方
function nil 方法也是基本类型。。。。
数据类型 | 描述 |
---|---|
nil | 只用nil 属于这个类,代表无效值,调用未赋值的变量时,返回nil,表达式中表示false |
boolean | true和false |
string | 字符串 一对单引号或双引号 ‘string’ “string” |
number | 标识双精度类型的实浮点数 |
function | 由C或Lua 编写的函数 |
userdata | 表示任意存储在变量中的C数据结构 |
thead | 独立线路,用于执行协同程序 |
table | Lua 中的表(table)其实是一个”关联数组”(associative arrays),数组的索引可以是数字或者是字符串。在 Lua 里,table 的创建是通过”构造表达式”来完成,最简单构造表达式是{},用来创建一个空表。 |
type 函数测试
print(type("Hello world")) --> string
print(type(10.4*3)) --> number
print(type(print)) --> function
print(type(type)) --> function
print(type(true)) --> boolean
print(type(nil)) --> nil
print(type(type(X))) --> string
string
可以用[[]]包含 表示一块字符串
html = [[
<html>
<head></head>
<body>
<a href="http://www.w3cschool.cc/">w3cschool菜鸟教程</a>
</body>
</html>
]]
print(html)
输出
<html>
<head></head>
<body>
<a href="http://www.w3cschool.cc/">w3cschool菜鸟教程</a>
</body>
</html>
当对数字字符串进行计算时,Lua会将其先转换为number
print("6"+1)
结果:7
字符串的连接是使用 ..
print("a".."b")
结果:ab
使用 # 来计算字符串的长度,放在字符串前面
> len = "www.w3cschool.cc"
> print(#len)
16
> print(#"www.w3cschool.cc")
16
>
了解一下有块的概念
table
在 Lua 里,table 的创建是通过”构造表达式”来完成,最简单构造表达式是{},用来创建一个空表。也可以在表里添加一些数据,直接初始化表
-- 创建一个空的 table
local tbtest = {}
print(tbl1)
结果: nil
-- 直接初始表
local tbtest = {
[1] = 1,
[2] = 2,
[3] = 3,
[4] = 4,
}
for k,v in ipairs(tbtest) do
print(v)
end
结果:1 2 3 4
--
如果是用 for key, value in ...的
需要使用 输出 print(valuse)
亲测之后 后面的值"value"可以用任意字符代替 只要后面输出语句 也是对应的 即可
eg: for k,a in ipairs(table) do print(a) end
Lua 中的表(table)其实是一个”关联数组”(associative arrays),数组的索引可以是数字或者是字符串。
a = {}
a["key"] = "value"
key = 10
a[key] = 22
a[key] = a[key] + 11
for k, v in pairs(a) do
print(k .. " : " .. v)
end
结果 : key:value
10 :33
table 是一个键值对应的数据结构,且难以获得其大小(排序解释),其次是 直接 用table={"1","b"}
不指定key的话 相当于数组功能,但是可以存放不同的值进去,默认角标从 1 开始
table遍历
- for key, value in pairs(tbtest)
- for key, value in ipairs(tbtest)
- for i=1, #(tbtest)
- for i=1, table.maxn(tbtest)
此处tbtest 定义如下
tbtest = {1,2,3,4}
for key,value in pairs(tbtest) do
print(tbtest[key]
end
for key,value in ipairs(tbtest) do
print(tbtest[key]
end
前者遍历 按照hash值 会遍历所有的元素
后者按照table 的key 从1开始到key不连续即止
for i=1, #(tbtest)
这种方式无法遍历所有的元素,因为'#'只会获取tbtest中从key为1开始的key连续的那几个元素,
如果没有key为1,那么这个循环将无法进入。
for i=1, table.maxn(tbtest) do
--这种方式同样无法遍历所有的元素,因为table.maxn只会获取key为整数中最大的那个数,
遍历的元素其实是查找tbtest[1]~tbtest[整数key中最大值],所以,对于string做key的元素不会去查找,
而且这么查找的效率低下,因为如果你整数key中定义的最大的key是10000,然而10000以下的key没有几个,
那么这么遍历会浪费很多时间,因为会从1开始直到10000每一个元素都会查找一遍,实际上大多数元素都是不存在的,
总结
for key, value in pairs(tbtest)
根据hash 值来进行排序 并不是按照table的key 值,但是会便利所有的table
for key, value in ipairs(tbtest)
按照key的顺序来遍历,也是从1开始
for i=1, #(tbtest)
从1 开始 找不到1 就输出0,key值不连续,也不继续执行
for i=1, table.maxn(tbtest)
效率低。
通常使用的迭代器
function pairsByKeys(t)
local a = {}
for n in pairs(t) do
a[#a+1] = n
end
table.sort(a)
local i = 0
return function()
i = i + 1
return a[i], t[a[i]]
end
end
遍历使用
for key, value in pairsByKeys(tbtest) do
if nSeq <= key then
return key
end
end
function
在 Lua 中,函数是被看作是”第一类值(First-Class Value)”,函数可以存在变量里:
function factorial1(n)
if n == 0 then
return 1
else
return n * factorial1(n - 1)
end
end
print(factorial1(5))
factorial2 = factorial1
print(factorial2(5))
结果:
120
120
thread
在 Lua 里,最主要的线程是协同程序(coroutine)。它跟线程(thread)差不多,拥有自己独立的栈、局部变量和指令指针,可以跟其他协同程序共享全局变量和其他大部分东西。
线程跟协程的区别:线程可以同时多个运行,而协程任意时刻只能运行一个,并且处于运行状态的协程只有被挂起(suspend)时才会暂停。