`
hulianwang2014
  • 浏览: 693199 次
文章分类
社区版块
存档分类
最新评论
  • bcworld: 排版成这样,一点看的欲望都没有了
    jfinal

Lua基础 类型和值(一)

 
阅读更多

Lua是一个动态类型的语言,没有类型定义,每个值都有自己的类型。


Lua有8个基本类型,nil, boolean, number, string, userdata, function, thread, table,利用type函数可以打印出一个给定值的类型。


注意最后一行,无论x为什么值,结果一定是string,因为type函数的结果总是一个string。


变量没有预定义的类型,任何变量可以有任何类型的值


注意最后两行,函数也是可以用来赋值的,你可以像对待其他的变量一样来把函数当成一个变量。


通常情况下,如果你把一个变量用来包含不同类型的值,会使代码看起来很混乱。但是,有时有效地利用这个特性,会有意想不到的效果。例如使用nil来对函数的返回值就行判断,来区分一个正常的返回值还是一个异常条件。


1 Nil

Nil类型只有一个值,nil,跟其他任何值都不同。如我们之前看到的,在一个全局变量未被赋值之前,它的值为nil,你也可以通过将一个全局变量赋值为nil来删除它。Lua用nil作为一个无值类型,表示一个变量不再起作用。


2 Booleans

Boolean类型含有两个值,true和false。但是Lua中可以表示条件的变量不仅仅boolean类型,任何值都可以表示条件。Lua认为false和nil为"假",其他任何值都是"真"。注意,跟其他语言不同的是,Lua认为0和空字符串为"真"。


3 Numbers

Number类型代表实数(在计算机中占两个地址的浮点数)。Lua没有整型,并且也不需要。有个普遍的误解,使用浮点型会有算术错误,一些人害怕浮点型即使一个简单的“加”运算也会有奇奇怪怪的问题。但事实上,用一个double类型来表示一个integer,不存在任何边界问题(除非这个数大于1.0e14)。Lua可以表示任何的32-bit的整数,不存在任何边界问题。除此之外,大多数cpu处理浮点数会比整数要快。


不过,Lua为了编译方便,也使用了其他的number类型,例如long和单浮点数。这是为了兼容一些不支持double类型的设备。


以下这些numeric常量都是合法的

4

0.4

4.57e-3

0.3e12

5e+20


4 Strings

String在Lua中与其他编程语言没有什么不同,都是表示一串字符。但是Lua可以在字符串中含有任何字符,包括0.


String在Lua中不可被更改,是常量。你不能更改一个字符串中的某一个字符,但是可以创建一个新的string。例如

Lua的string是自动管理内存的,其他的lua对象(例如table, function,etc)也一样。这意味着你不必担心string的内存分配与释放,让Lua为你处理这些问题就好了。一个string可以包含一个字符,也可以包含一整本书,Lua可以有效地处理长string,处理100k-1M的字符串,对Lua来说是小菜一碟。

4.1 Lua string的划界

上面说了,Lua的string可以包含任何字符,甚至0(在C中,0是被认为是string的结尾的)。因此Lua对字符串边界的判定,不能用0,而是匹配单引号'或者双引号" :


但是在编程的时候,为了风格统一,最后是只用其中一种,除非string本身含有引号。或者在字符串中用转义字符。Lua的string可以使用以下C风格的转义字符:

\a bell

\b back space

\f form feed

\n newline

\r carriage return

\t horizontal tab

\v vertical tab

\\ backslash

\" double quote

\' single quote

示例如下:



我们可以在string中用一个字符的ASCII值来表示它,格式为\ddd,这里ddd最多包含3个数字字符,例如:

97表示"a", 10表示new line,49表示数字"1",注意\049没有写成\49的原因是,后面跟的字符是数字,若写成\49,那么会被认为是\492,这就不是我们想要的了。


对string划界,除了匹配引号之外,我们可以像处理长注释一样,匹配两个“[[”“]]”。使用这种划界方式的string通常会有几行,如果第一个字符是“换行符”,则会被忽略掉,并且不会解释转义字符(如下示例),保持原样输出。通常在string中包含代码片段的时候使用比较方便。


这个时候,有个疑问,如果我的string中含有“[[”或者“]]”,怎么办。Lua提供了一个更方便的解决办法,就是使用类似[====[这样的匹配符号,“=”个数任意,但是保证前后相同,如果“=”个数不同,那么就会被忽略掉。


这种方式也可以用在长注释中,这里就不演示了。


4.2 Lua中string与number的相互转换

Lua提供了string和number的运行时自动转换。任何对string进行的算术操作,都会尝试将string转换为number。例如:


除了算术操作,其他任何期待一个number的地方,如果传入string,都是尝试将string转换为number。相反,在一个期待string的地方,如果传入number,那么也会尝试将number转换为string。


“..”是Lua中的字符串连接符,在10之后要有一个空格“ ”,否则第一个“.”会被看作是小数点。

现在看来,在Lua的设计中,支持这些自动转换是不是一个good idea,都没有一个定论。但是,不要太指望它们。它们在少数场合用起来很方便,但是会增加语言的复杂性,增加使用它们的程序的复杂性。毕竟string和number是两个不同的东西。10 == “10”是false,因为10是一个number,而“10”是一个string。如果你想把string转换为number,显式地用函数tonumber,如果要转换的string不能被转为number,它返回nil。


将number转换为string,可以用函数tostring。另外,可以用“#”来取得一个string的长度。



水平有限,如果有朋友发现错误,欢迎留言交流。


分享到:
评论

相关推荐

    Lua 入门教程

    Lua 是巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de Janeiro)里的一个研究小组于 1993 年开发的,该小组成员有:Roberto Ierusalimschy、Waldemar Celes 和 Luiz Henrique de Figueiredo。...

    LUA5.1 脚本语言 编译执行源码

    5、提供thread类型和结构化的协程(coroutine)机制,在此基础上可方便实现协作式多任务;6、运行期能编译字符串形式的程序文本并载入虚拟机执行;7、通过元表(metatable)和元方法(metamethod)提供动态元机制(dynamic ...

    Lua教程(二):基础知识、类型与值介绍

    主要介绍了Lua教程(二):基础知识、类型与值介绍,本文讲解了Hello World程序、代码规范、全局变量、类型与值等内容,需要的朋友可以参考下

    Lua中文教程(pdf版)

    第2章类型和值9 2.1 Nil..............9 2.2 Booleans....9 2.3 Numbers...10 2.4 Strings......10 2.5 Functions.12 2.6 Userdata and Threads.12 第3章表达式..13 3.1 算术运算符...............13 3.2 ...

    实现Lua中数据类型的源码分享

    在Lua中有8种基础类型,像其他动态语言一样,在语言中没有类型定义的语法,每个值都携带了它自身的类型信息。下面我们就来尝试通过Lua 5.2.1的源码来看类型的实现

    99乘法表java源码-learn-lua:学习lua

    语言只提供唯一一种数据结构,称为(table),它混合了数组、哈希,可以用任何类型的值作为key和value。提供了一致且富有表达力的表构造语法,使得Lua很适合描述复杂的数据。 函数是一等类型,支持匿名函数和正则尾...

    lua-bint:纯Lua中的任意精度整数算术库

    与纯Lua中的大多数任意精度整数库不同,该库在其实现中使用lua整数数组作为基础数据类型,而不是使用字符串或大表,这使得使用固定宽度的整数并使其有效按位运算。 Bint代表Big Integer。 该库的实现受到极大启发...

    lua 程序设计学习.doc 版

    第2章 类型和值 2.1 Nil 2.2 Booleans 2.3 Numbers 2.4 Strings 2.5 Functions 2.6 Userdata and Threads 第3章 表达式 3.1 算术运算符 3.2 关系运算符 3.3 逻辑运算符 3.4 连接运算符 3.5 优先级 3.6 表的构造 第4...

    LuaFramework_UGUI_V2-master.zip

    大量内建基础类型支持,如枚举,委托,事件,Type, 数组,迭代器等 支持多种协同形式 支持所有unity内部类导出,支持委托类型导出 支持导出自定义,跳过某个空的基类,修改导出名称等 支持扩展函数自定义导出, 比如...

    像计算机科学家一样思考Python(第2版).pdf

    1.5 值和类型 4 1.6 形式语言和自然语言 5 1.7 调试 6 1.8 术语表 7 1.9 练习 8 第2章 变量、表达式和语句 9 2.1 赋值语句 9 2.2 变量名称 9 2.3 表达式和语句 10 2.4 脚本模式 11 2.5 操作...

Global site tag (gtag.js) - Google Analytics