Lua数据类型
lua是动态类型语言,变量不要类型定义,只需要为变量赋值,值就可以存储在变量中,作为参数传递和结果返回。
lua中有8个基本类型分别为:nil 、boolean、number、string、userdata、function、thread、table.
数据类型 | 描述 |
---|---|
nil | 这个最简单,只有nil属于该类,表示一个无效值(在条件表示式中相当于false) |
boolean | false 、true |
number | 表示双精度类型的实浮点数 |
string | 字符串由一堆双引号或单引号来表示 |
function | 由c或lua编写的函数 |
userdata | 表示任意存储在变量中的c数据结构 |
thread | 表示执行的独立线路,用于执行协同程序 |
table | lua中的表(table) 其实是一个”关联数组“(associative arrays)数组的索引可以是数字或者字符串。 在Lua里,table的创建是通过“构造表达式”来完成,最简单的构造表达式{},用来创建一个空表 |
使用type()函数查看变量或者值的类型:
> print(type("aaa"))
string
> return print(type(1))
number
> return print(type(1.0))
number
> return print(type(print))
function
> return print(type(type))
function
> return print(type(true))
boolean
> return print(type(nil))
nil
> return print(type(type(x)))
string
>
nil(空)
nil类型表示一种没有任何有效值,它只有一个值 --nil。
例如打印一个没有赋值的变量,便会输出一个nil值
> print(a)
nil
>
对于全局变量和table,nil还有一个”删除“的作用,给全局变量或者table表里的变量赋一个nil值,等同于把他们删掉。
> tab1 = {key1 = "a", key2 = "b", "c"}
> for k, v in pairs(tab1) do
>> print(k .. "-" .. v)
>> end
1-c
key2-b
key1-a
> tab1.key1 = nil
> for k, v in pairs(tab1) do
print(k .. "-" .. v)
end
1-c
key2-b
>
nil作为比较时应加上双引号:
>
> type(x)
nil
> type(x)==nil
false
> type(x)=="nil"
true
>
原因:type(type(x)) == string 即type(x)返回string类型的值。
boolean(布尔)
boolean类型只有两个可选值:true、false。lua把false 和 nil都看作假,其他都为真。
> print(type(true))
boolean
> print(type(false))
boolean
> print(type(nil))
nil
>
> if false or nil then
>> print("at least one is true")
>> else
>> print("false and nil all false!!")
>> end
false and nil all false!!
>
number(数字)
lua只有一种number类型 -- double(双精度),以下几种写法都被看做number类型
> print(type(2))
number
> print(type(2.2))
number
> return print(type(2.2))
number
> return print(type(0.2))
number
> return print(type(2e+1))
number
> return print(type(2e-1))
number
>
string(字符串)
字符串由一对双引号或单引号来表示。
> string1 = "this is string1"
> string2 = "this is string2"
> print(type(string1))
string
> return print(type(string2))
string
>
也可以用两个方括号”[[]]“来表示“一块”字符串:
> html = [[
>> <html>
>> <head></head>
>> <body>
>> <a href = "http://www.baidu.com"> aaa </a>
>> </body>
>> </html>
>> ]]
> print(html)
<html>
<head></head>
<body>
<a href = "http://www.baidu.com"> aaa </a>
</body>
</html>
>
在对一个数字字符串进行算术运算操作时,lua会尝试将这个数字字符串转换成一个数字:
> print("1"+2)
3.0
> print("3"+"6")
9.0
> print("2 + 6")
2 + 6
> print("aa"+1)
stdin:1: attempt to perform arithmetic on a string value
stack traceback:
stdin:1: in main chunk
[C]: in ?
>
字符串连接:
> print("aa".."cc")
aacc
>
> print(123 .. 567)
123567
?? 数字也可以用 .. 进行连接 ???
使用#来计算字符串的长度,放在字符串前面:
> len="abcdef"
> print(#len)
6
>
table表
在lua里,table的创建是通过“构造表达式”来完成,最简单的构造表达式{},用来创建一个空表。也可以在表里添加一些数据直接初始化表:
-- 创建一个空的table
local tbl1 = {}
-- 直接初始化表
local tbl2 = {"apple", "pear", "orange", "grape"}
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
root@mzs:/home/mzs/lua_study/lua_mzs/hello# lua table_test.lua
10:33
key:value
不同于其他语言的数组把0作为数组的初始索引,在lua表里的默认初始索引一般以1开始:
local tbl = {"apple", "pear", "orange", "grape"}
for key, val in pairs(tbl) do
print("key", key)
end
root@mzs:/home/mzs/lua_study/lua_mzs/hello# lua table_test1.lua
key 1
key 2
key 3
key 4
table不会固定长度大小,有新数据添加时table长度会自动增长,没初始的table都是nil:
a3={}
for i = 1, 10 do
a3[i] = i
end
a3["key"] = "val"
print(a3["key"])
print(a3["none"])
root@mzs:/home/mzs/lua_study/lua_mzs/hello# lua table_test3.lua
val
nil
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))
root@mzs:/home/mzs/lua_study/lua_mzs/hello# lua func_test.lua
120
120
function 可以以匿名函数(anonymous function)的方式通过参数传递:
function testFun(tab, fun)
for k, v in pairs(tab) do
print(fun(k, v))
end
end
tab = {key1="val1", key2="val2"}
testFun(tab,
function(key,val)
return key.."="..val
end
)
root@mzs:/home/mzs/lua_study/lua_mzs/hello# lua func_test2.lua
key1=val1
key2=val2
thread (线程)
在lua里,最主要的线程就是协同程序(coroutine).它跟线程(thread)差不多,拥有自己独立的栈、独立变量、指令指针,可以跟其他协同程序共享全局变量和其他大部分东西。
userdata(自定义类型)
userdata是一种用户自定义数据,用于表示一种由应用程序或c/c++语言库所创建的类型,可以将任意c/c++的任意类型的数据(通常是struct 和指针)存储到Lua变量中调用。