lua数据类型

Lua数据类型


lua是动态类型语言,变量不要类型定义,只需要为变量赋值,值就可以存储在变量中,作为参数传递和结果返回。

lua中有8个基本类型分别为:nil 、boolean、number、string、userdata、function、thread、table.

数据类型描述
nil这个最简单,只有nil属于该类,表示一个无效值(在条件表示式中相当于false)
booleanfalse 、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变量中调用。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值