Lua 笔记(第一天)

小白新学,所有资料源于互联网 此处,仅为记录


Lua中的数据类型

Lua 是动态类型语言 类似JS不需类型的定义,只需要直接赋值。
Lua 中有7种基本数据类型:nil,boolean,number,string,usedata,function,thread,table。
userdata thread table 和Java不同的地方
function nil 方法也是基本类型。。。。

数据类型描述
nil只用nil 属于这个类,代表无效值,调用未赋值的变量时,返回nil,表达式中表示false
booleantrue和false
string字符串 一对单引号或双引号 ‘string’ “string”
number标识双精度类型的实浮点数
function由C或Lua 编写的函数
userdata表示任意存储在变量中的C数据结构
thead独立线路,用于执行协同程序
tableLua 中的表(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值 会遍历所有的元素 
后者按照tablekey1开始到key不连续即止


for i=1, #(tbtest) 
这种方式无法遍历所有的元素,因为'#'只会获取tbtest中从key1开始的key连续的那几个元素,
如果没有key1,那么这个循环将无法进入。

for i=1, table.maxn(tbtest) do
--这种方式同样无法遍历所有的元素,因为table.maxn只会获取key为整数中最大的那个数,
遍历的元素其实是查找tbtest[1]~tbtest[整数key中最大值],所以,对于string做key的元素不会去查找,
而且这么查找的效率低下,因为如果你整数key中定义的最大的key10000,然而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)时才会暂停。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值