Chinaunix首页 | 论坛 | 博客
  • 博客访问: 885484
  • 博文数量: 66
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 2071
  • 用 户 组: 普通用户
  • 注册时间: 2012-12-04 15:22
个人简介

从事IT相关工作近10年,获得《网络规划师》《信息系统项目管理师》《系统分析师》、Cisco等认证,对网络和操作系统有较深理解,对认证计费系统和虚拟化技术有深入研究。

文章分类

全部博文(66)

文章存档

2019年(4)

2018年(1)

2015年(2)

2014年(16)

2013年(43)

分类: Python/Ruby

2014-01-02 01:42:35

1、 lua具有8种基础类型:nil boolean number string userdata(用户自定义) function thread(线程) table(表)
可以使用 type() 函数 返回其类型,type函数本身返回的数据类型是字符串


  1. print(type(10.3*3)) -->number
  2. print(type(true)) -->boolean
  3. print(type(type(x))) -->string 因为type(x)无关x都会返回string类型
  4. a=print 也是合法的
  5. 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语言中那样直接修改某个字符,而是根据修改要求来创建一个新的字符串。

  1. a = "one string"
  2. b=string.gsub(a,"one","another")
  3. b=a:gsub("one","another")

这样可以修改字符串中的一部分,当然也可以使用 这样的语法进行操作
lua中字符串和其他lua对象都是自动内存管理机制,无须担心字符串的分配和释放,高效处理字符串,因此1M的字符串在lua中也是常见的,字面字符串(literal string)需要一对匹配的单引号或者双引号作为定位符

字符串转义非常简单,和C语言一致 \n 换行 \r 回车
还有就是 [[ ]] 定界方法,这样的话,中间的内容就会被当做heredoc一样,不进行任何的转义等,书写含有其他代码的代码块时非常有用
page = [[
主页
]]

lua中,.. 是字符串连接操作符,在一个数字后面直接输入时需要使用一个空格分隔,不然第一个点会被当做小数点。

类型判断和自动类型转换
Lua会尽量尝试将一个字符串转换成数字类型然后参与运算的,如果实在不能转换将会导致错误

  1. print("10" + 1) --> 11
  2. print("10 + 1") --> 10+1
  3. print("5" * "2") --> 10
  4. print("hello" + 1) --> ERROR attempt to perform artihmetic on a string value
手动类型转化的两个函数s

  1. tostring()
  2. 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)完成,也就是 

  1. a = {} -- 创建一个table并把它引用存储到a中
  2. k = "x"
  3. a[k] = 10
  4. print(a[k]) -- 10
  5. print(a["x"]) --10


table 永远都是匿名的,持有table与table自身之间没有固定的关联性,比如继续上面的例子

  1. c = a
  2. print(c["x"]) -->10
  3. c = nil -->释放引用
  4. a = nil -->释放引用

一旦一个表没有被引用的时候,那么Lua的垃圾收集器(Garbage Collector)最终会删除这个table并复用它的内存。

当一个table中的值没有初始化的时候,它的值就是 nil ,可以将nil值赋值到某个元素来删除该元素,lua将全局变量存储在一个普通的table中的,对于table中的元素也提供了一个 语法糖(syntactic sugar)

  1. a = {} --这一步是必须的,需要创建一个空的table才能用
  2. a.x = 10 --> a["x"] = 10
  3. print(a.x) --> print(a["x"]
  4. -- 注意区分 a[x] ,a["x"] ,a.x
  5. -- 强调,语法糖只能用于关联数组,是不能用到普通数字索引的 a.0 是不正确的

表的索引长度问题
默认lua采用 1 作为索引的起始值,比如下面读取10行输入内容后写入到一个table中

  1. a = {}
  2. for i=1,10 do
  3.     a[i] = io.read()
  4. 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来表示文件。

阅读(5513) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~