1、 lua具有8种基础类型:nil boolean number string userdata(用户自定义) function thread(线程) table(表)
可以使用 type() 函数 返回其类型,type函数本身返回的数据类型是字符串
-
print(type(10.3*3)) -->number
-
print(type(true)) -->boolean
-
print(type(type(x))) -->string 因为type(x)无关x都会返回string类型
-
-
a=print 也是合法的
-
a(type(a)) -->function
函数是作为 第一类值(first-class value)看待,可以箱操作一个其他值一样操作一个函数值,一个变量用于不同类型,通常会导致混乱的代码。
2、 具体的数据类型和解释
①nil 空:只有一个值nil,是一种无效值的情况,即没有任何有效值
②bolean 布尔型:两个可选择 false true,boolean不是一个条件值的唯一表示方式。lua中任意的一个值都可以表示一个条件,因此是 把false和nil认为假,其他的都认为是真,这里同时把空字符串和0都会当做真。
③number 数字:表示实数,lua语言中没有整数类型【和Javascript是一样的】。书写数字常量的表示法,可以使用普通表示法,也可以使用科学计数法 4 0.4 4.33e-3 0.3e12 5e+20 都是正确的。
④字符串型:lua中的字符串表示“一个字符序列”,采用8位编码,lua字符串中字符可以具有任何数值编码,包括数值0,可以将任意二进制数据存储到一个字符串中。lua字符串是不可变值(immutable values),不能像C语言中那样直接修改某个字符,而是根据修改要求来创建一个新的字符串。
-
a = "one string"
-
b=string.gsub(a,"one","another")
-
b=a:gsub("one","another")
这样可以修改字符串中的一部分,当然也可以使用 这样的语法进行操作
lua中字符串和其他lua对象都是自动内存管理机制,无须担心字符串的分配和释放,高效处理字符串,因此1M的字符串在lua中也是常见的,字面字符串(literal string)需要一对匹配的单引号或者双引号作为定位符
字符串转义非常简单,和C语言一致 \n 换行 \r 回车
还有就是 [[ ]] 定界方法,这样的话,中间的内容就会被当做heredoc一样,不进行任何的转义等,书写含有其他代码的代码块时非常有用
lua中,.. 是字符串连接操作符,在一个数字后面直接输入时需要使用一个空格分隔,不然第一个点会被当做小数点。
类型判断和自动类型转换
Lua会尽量尝试将一个字符串转换成数字类型然后参与运算的,如果实在不能转换将会导致错误
-
print("10" + 1) --> 11
-
print("10 + 1") --> 10+1
-
print("5" * "2") --> 10
-
print("hello" + 1) --> ERROR attempt to perform artihmetic on a string value
手动类型转化的两个函数s
-
tostring()
-
tonumber() -- 如果无法将一个值转换成有效的数字,那么就会得到 nil 这个值
【JS中的函数 Number(),String(),toString(),toFixed(),toNumber】
对字符串求长度,在5.1版本的lua中可以使用 # (求长度运算符) 进行获取到字符串的长度
⑤ table (表)
table可以实现“关联数组(associative array),也可以实现普通的使用数字索引的方式的普通数组。
Lua也是通过table来表示模块(module)、包(package)和对象(object),比如 io.read 的时候,含义是”io模块中的read函数“,使用字符串"read"作为key(键)来索引 table.io。
Lua中,table既不是“值”也不是“变量”,而是”对象“。
表的构造和引用
table最简单的创建方法是”构造表达式(constructor expression)完成,也就是
-
a = {} -- 创建一个table并把它引用存储到a中
-
k = "x"
-
a[k] = 10
-
print(a[k]) -- 10
-
print(a["x"]) --10
table 永远都是匿名的,持有table与table自身之间没有固定的关联性,比如继续上面的例子
-
c = a
-
print(c["x"]) -->10
-
c = nil -->释放引用
-
a = nil -->释放引用
一旦一个表没有被引用的时候,那么Lua的垃圾收集器(Garbage Collector)最终会删除这个table并复用它的内存。
当一个table中的值没有初始化的时候,它的值就是 nil ,可以将nil值赋值到某个元素来删除该元素,lua将全局变量存储在一个普通的table中的,对于table中的元素也提供了一个 语法糖(syntactic sugar)
-
a = {} --这一步是必须的,需要创建一个空的table才能用
-
a.x = 10 --> a["x"] = 10
-
print(a.x) --> print(a["x"]
-
-- 注意区分 a[x] ,a["x"] ,a.x
-
-- 强调,语法糖只能用于关联数组,是不能用到普通数字索引的 a.0 是不正确的
表的索引长度问题
默认lua采用 1 作为索引的起始值,比如下面读取10行输入内容后写入到一个table中
-
a = {}
-
for i=1,10 do
-
a[i] = io.read()
-
end
获取表的长度,可以使用 # 进行获取(5.1支持,之前可以使用 table.getn() 函数来获取),长度判断以 nil 作为定界数组结尾,如果有 ”空隙(hole),长度将会以空隙开始作为结束,因此不准确,可以使用 table.maxn() 函数获取到最大的索引值【注意只能用于普通数字索引的数组,带有字符串索引的长度无法判】
⑥function 函数
函数是作为第一类值来对待的,可以存储在变量中,当做参数传递给其他函数,也可以作为其他函数的返回值。对函数式编程(functional programming)提供了良好的支持。
Lua既可以调用自身的函数,也可以调用C语言编写的函数,Lua的所有的标准库都是用C语言写的,标准库中包含了 字符串操作、table的操作、I/O、操作系统的功能调用、数学函数和调试函数。
⑦⑧ userdata (自定义函数)和thread(线程)
userdata类型可以将任意的C语言数据存储到Lua变量中,这种类型没有太多的操作,也只有赋值和相等性测试。userdata用于表示一种由应用程序或C语言库所创建的新类型,比如标准的I/O库就用userdata来表示文件。
阅读(5466) | 评论(0) | 转发(1) |