Lua数据类型介绍(共16篇)由网友“落难王八邓超元”投稿提供,下面小编给大家带来Lua数据类型介绍,希望能帮助到大家!
篇1:Lua数据类型介绍
这篇文章主要介绍了Lua数据类型介绍,本文讲解了Lua中的nil(空)、boolean(布尔)、number(数字)、string(字符串)、table(表)、function(函数)、thread(线程)、userdata(自定义类型)等数据类型,需要的朋友可以参考下
Lua 是一个功能强大、快速、轻量的可嵌入式脚本语言,由标准的 ANSI C 实现,由于拥有一组精简的强大特性,以及容易使用的 C API,这使得它可以很容易嵌入或扩展到其他语言中使用,并且有个非官方认领的中文名 -- “撸啊”,
安装 Lua
Lua 安装很简单,把源码下载下来后,直接 make 就行:
代码如下:
wget www.lua.org/ftp/lua-5.2.2.tar.gz
tar -zxvf lua-5.2.2.tar.gz
cd lua-5.2.2
make generic
make install
lua -e ‘print(“Hello World!”)‘
如果是 Mac 用户,并且装有 Homebrew 的话,一条指令就行:
代码如下:
brew install lua
Lua 是动态(弱)类型的语言,它有一下几种数据结构:
nil(空)
nil 类型表示一种没有任何有效值,它只有一个值 -- nil,例如打印一个没有赋值的变量,便会输出一个 nil 值:
代码如下:
print(type(a))
对于全局变量和 table,nil 还有一个“删除”作用,给全局变量或者 table 表里的变量赋一个 nil 值,等同于把它们删掉,执行下面代码就知:
代码如下:
tab1 = { key1 = “val1”, key2 = “val2”, “val3” }
for k, v in pairs(tab1) do
print(k .. “ - ” .. v)
end
tab1.key1 = nil
for k, v in pairs(tab1) do
print(k .. “ - ” .. v)
end
boolean(布尔)
boolean 类型只有两个可选值:true(真) 和 false(假),Lua 把 false 和 nil 看作是“假”,其他的都为“真”
代码如下:
print(type(true))
print(type(false))
print(type(nil))
if type(false) or type(nil) then
print(“false and nil are false!”)
else
print(“other is true!”)
end
number(数字)
Lua 默认只有一种 number 类型 -- double(双精度)类型(默认类型可以修改 luaconf.h 里的定义),以下几种写法都被看作是 number 类型:
代码如下:
print(type(2))
print(type(2.2))
print(type(0.2))
print(type(2e+1))
print(type(0.2e-1))
print(type(7.8263692594256e-06))
string(字符串)
字符串由一对双引号或单引号来表示
代码如下:
string1 = “this is string1”
string2 = ‘this is string2‘
也可以用 2 个方括号 “[[]]” 来表示“一块”字符串
代码如下:
html = [[
just a link
]]
print(html)
在对一个数字字符串上进行算术操作时,Lua 会尝试将这个数字字符串转成一个数字
代码如下:
print(“2” + 6)
print(“2” + “6”)
print(“2 + 6”)
print(“-2e2” * “6”)
print(“error” + 1)
使用 .. 连接字符串
代码如下:
print(“a” .. ‘b‘)
print(157 .. 428)
使用 # 作为长度操作符,放在字符串前面可以获取该字符串的长度
代码如下:
len = “length”
print(#len)
print(#“length”)
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
不同于其他语言的数组把 0 作为数组的初始索引,在 Lua 里表的默认初始索引一般以 1 开始
代码如下:
local tbl = {“apple”, “pear”, “orange”, “grape”}
for key, val in pairs(tbl) do
print(“Key”, key)
end
table 的变量只是一个地址引用,对 table 的操作不会产生 table 的副本或创建新的 table
代码如下:
a1 = {}
a1[“key”] = “val1”
a2 = a1
print(a2[“key”])
a2[“key”] = “val2”
print(a1[“key”])
print(a1.key)
table 不会固定长度大小,有新数据添加时 table 长度会自动增长,没初始的 table 都是 nil
代码如下:
a3 = {}
for i = 1, 10 do
a3[i] = i
end
a3[“key”] = “val”
print(a3[“key”])
print(a3[“none”])
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))
function 可以以匿名函数(anonymous function)的方式通过参数传递
代码如下:
function anonymous(tab, fun)
for k, v in pairs(tab) do
print(fun(k, v))
end
end
tab = { key1 = “val1”, key2 = “val2” }
anonymous(tab, function(key, val)
return key .. “ = ” .. val
end)
thread(线程)
在 Lua 里,最主要的线程是协同程序(coroutine)。它跟线程(thread)差不多,拥有自己独立的栈、局部变量和指令指针,可以跟其他协同程序共享全局变量和其他大部分东西。
线程跟协程的区别:线程可以同时多个运行,而协程任意时刻只能运行一个,并且处于运行状态的协程只有被挂起(suspend)时才会暂停。
userdata(自定义类型)
userdata 是一种用户自定义数据,用于表示一种由应用程序或 C/C++ 语言库所创建的类型,可以将任意 C/C++ 的任意数据类型的数据(通常是 struct 和 指针)存储到 Lua 变量中调用。
篇2:Python基本数据类型详细介绍
最近更 新
python代码检查工具pylint 让你的python更
python操作数据库之sqlite3打开数据库、删
python网络编程学习笔记(六):Web客户端访
python中使用sys模板和logging模块获取行
python利用elaphe制作二维条形码实现代码
Python 学习笔记
9种python web 程序的部署方式小结
Python实现类继承实例
Python中条件选择和循环语句使用方法介绍
Python实现的几个常用排序算法实例
热 点 排 行
Python入门教程 超详细1小时学会
python 中文乱码问题深入分析
比较详细Python正则表达式操作指
Python字符串的encode与decode研
Python open读写文件实现脚本
Python enumerate遍历数组示例应
Python 深入理解yield
Python+Django在windows下的开发
python 文件和路径操作函数小结
python 字符串split的用法分享
篇3:Lua教程(一):Lua脚本语言介绍
这篇文章主要介绍了Lua教程(一):Lua脚本语言介绍,需要的朋友可以参考下
Lua 是一个扩展式程序设计语言,它被设计成支持通用的过程式编程,并有相关数据描述的设施, Lua 也能对面向对象编程,函数式编程,数据驱动式编程提供很好的支持。 它可以作为一个强大、轻量的脚本语言,供任何需要的程序使用。 Lua 以一个用 clean C 写成的库形式提供。(所谓 Clean C ,指的 ANSI C 和 C++ 中共通的一个子集)
作为一个扩展式语言,Lua 没有 “main” 程序的概念:它只能 嵌入 一个宿主程序中工作,这个宿主程序被称作 embedding program 或简称为 host ,
宿主程序可以通过调用函数执行一小段 Lua 代码,可以读写 Lua 变量,可以注入 C 函数让 Lua 代码调用。 这些扩展的 C 函数,可以大大的扩展了 Lua 可以处理事务的领域,这样就可以订制出各种语言, 而它们共享一个统一的句法格式的框架。 Lua 的官方发布版就包含了一个叫做 lua 的简单的宿主程序,它用 Lua 库提供了一个保证独立的 Lua 解释器。
Lua 是一个自由软件,它的使用许可决定了对它的使用过程一般没有任何保证。 这份手册中描述的东西的实现,可以在 Lua 的 www.lua.org 找到,
跟其它的许多参考手册一样,这份文档有些地方比较枯燥。 关于 Lua 的设计想法的探讨,可以看看 Lua 网站上提供的技术论文。 有关用 Lua 编程的细节介绍,可以读一下 Roberto 的书,Programming in Lua (Second Edition) 。
篇4:数字数据类型
常用的:
1.优化循环,通过重新组织重复的子表达式来提高循环体的运行性能。
2减少使用对象的数量来提高运行性能。
3.缩减网络传输数据来缩短等待时间。
其他:
1.采用对象池技术,提高对象的利用效率。
性能的损耗主要源于创建和释放对象,因此要避免对象的创建和释放。采用对象池技术,预先定义一个对象池,预先创建一组待使用的对象:
Enemy[5] enemy=new Enemy[5];
for(int i=0;i<5;i++){
enemy[i]=new Enemy;
}
增加标志如used和reset标识Enemy的状态。需要创建对象时从对象池中获取 一个未被使用的对象并用reset方法初始化;需要释放时只需修改标志位以供下次使用即可,
2.尽可能使用基本数据类型代替对象
例如用二维数组代替一个写简单的对象。
3.优化算法
比如对于默写不要求很精细的场景和算法,用简单的算法模拟。
4.其他优化
a.如提取字符串时,试着返回子串而不是创建一个副本。
b.尽量的少创建短期的临时对象。
c.能用库函数的就不要自己创建(库函数是优化好的)
d.Map map=new HashMap();
HashMap map=new HashMap(); //这个性能更高,重构代码
e.增强型for循环和Iterable使用时,多了一个对象的创建,慎用。
f.避免enum类型。
g.嵌入式开发时注意浮点的运用,尽量不用。(处理器是否支持浮点)
h.图片资源压缩、多张图片集中到一张图片上(比单独的和小很多,省去了每张的头文件、结束文件等数据块,合并了调色板)
篇5:python基础教程之基本内置数据类型介绍
-02-02python原始套接字编程示例分享
2014-06-06pycharm 使用心得(八)如何调用另一文件中的函数
2014-04-04Python的ORM框架SQLAlchemy入门教程
2014-02-02使用python装饰器验证配置文件示例
2014-06-06教你如何在Django 1.6中正确使用 Signal
-03-03python 判断自定义对象类型
-09-09Python开发编码规范
-03-03python中wx将图标显示在右下角的脚本代码
2014-04-04python中的__init__ 、__new__、__call__小结
-09-09rhythmbox中文名乱码问题解决方法
篇6:python基础教程之基本内置数据类型介绍
最近更 新
python读取csv文件示例(python操作csv)
pycharm 使用心得(一)安装和首次使用
python实现猜数字游戏(无重复数字)示例分
python将xml xsl文件生成html文件存储示例
python实现rest请求api示例
python3使用tkinter实现ui界面简单实例
Python中os和shutil模块实用方法集锦
python中的实例方法、静态方法、类方法、
python将html转成PDF的实现代码(包含中文
python三元运算符实现方法
热 点 排 行
Python入门教程 超详细1小时学会
python 中文乱码问题深入分析
比较详细Python正则表达式操作指
Python字符串的encode与decode研
Python open读写文件实现脚本
Python enumerate遍历数组示例应
Python 深入理解yield
Python+Django在windows下的开发
python 文件和路径操作函数小结
python 字符串split的用法分享
篇7:Javascript数据类型转换规则
前言
Javascript有7种数据类型,包括5种原始类型(也叫原始值)number、Boolean、string、null、undefined和2种复合类型object、array,它们之间可以根据某种规则相互转换,《Javascript权威指南》列出了在Javascript中如何进行类型转换,
其中原始值之间的转换没什么可说的,记住就好了,我们要关注的是复合值(即对象)与原始值之间的转换。原始值转换成对象直接调用Object方法即可(null和undefined不可调用该方法),而对象转换成原始值呢?如空数组[]转换成数字为什么是0呢?
对象转换成原始值
对象转换成布尔值:所有对象转换成布尔值都是true,包括包装对象new Boolean(false)转换成布尔值也是true。
对象转换成字符串:如果对象有toString()方法,则调用这个方法,如果它返回原始值,将原始值转换成字符串后返回;如果对象没有toString()方法或调用toString()方法方法返回的不是原始值,则调用valueOf()方法,然后将valueOf()方法返回的原始值转换成字符串返回,如果valueOf()方法返回的还不是原始值,没救了,浏览器只好抛出类型异常的错误。
对象转换成数字:和对象转换成字符串过程类似,只不过先调的是valueOf()方法。
根据以上规则就可以知道为什么空数组转换成数字结果是0了:空数组先调用了valueOf()方法,返回了“”字符串,“”字符串是个原始值,再根据上面的表格,“”字符串转换成数字0。
隐式类型转换
来看一个例子:
“123” == 123
大家都知道结果是true,==运算符两边的操作数属于不同的数据类型,要判断是否相等,需要经过隐式类型转换成相同的数据类型才行。然而,是运算符左边的“123”转换成了数字123还是运算符右边的123转换成了字符串“123”呢?
规则是:
如果一个值是null,另一个是undefined,那么它们相等
如果一个值是数字,另一个是字符串,先将字符串转为数字再比较
如果其中一个值是true,将true转为1再比较,同理false转换成0再比较
如果一个值是对象,另一个是数字或字符串,则将对象转换成原始值再进行比较(日期对象转换成字符串,其它对象先尝试调用valueOf()方法再尝试使用toString())
其它不同类型的比较都不相等
显然上面的例子属于第二种情况,“123”被隐式转换为123了。
除了==运算符,诸如+、-、*、/、!、<、<=、>、>=等运算符两边的操作数类型不同时,都会发生隐式类型转换,还包括while()语句和if()语句内的条件语句,alert()语句会将()内的值隐式转换成字符串后再弹出。
“+”运算符
二元加法运算符“+”可以对两个数字做加法,也可以做字符串连接操作:
1 + 1 // 2
“hello” + “world” // “hello world”
当二元加法运算符“+”遇到下面的运算时操作数会如何转换呢?试着想想答案再往下看
1 + true
“1” + true
1 + “1”
{} + 1
{} + {}
隐式转换规则:
如果其中一个操作数是对象,对象会转换成原始值:日期对象通过toString()方法转换,其他对象通过valueOf()方法转换,如果valueOf()返回值不是原始值再使用toString()方法转换,
在进行了对象到原始值的转换后,如果其中一个操作数是字符串的话,另一个操作数也会转换为字符串,然后进行字符串拼接。
否则,两个操作数都将转换为数字(转换不了的将转换为NaN),然后进行加法操作。
根据规则,以上的例子结果是:
1 + true // true转换为1,然后加法得出结果2
“1” + true // true转换为“true”,然后字符串拼接得出结果“1true”
1 + “1” // 数字1转换为“1”,然后字符串拼接得出结果“11”
{} + 1 // {}对象调用toString()方法转换为字符串“[object Object]”,变成了“[object Object]” + 1,匹配第二条规则,1将转换为字符串“1”,然后字符串拼接得出结果“[object Object]1”
{} + {} // 自己想想过程吧
当“+”做为一元运算符时,会把操作数转换为数字(转不了的转成NaN)
“-”运算符
当“-”做为二元运算符时,会把操作数转换为数字(转不了的转成NaN)
当“-”做为一元运算符时,会把操作数转换为数字(转不了的转成NaN),同时改变运算结果的符合
比较运算符(“>”、“>=”、“<”、“<=”)
比较操作符的操作数可能是任意类型,然而只有数字和字符串才能真正执行比较操作,因此其它类型的操作数都将进行类型转换,具体规则如下:
如果操作数为对象,那么这个对象将转换为原始值:同上,日期对象通过toString()方法转换,其他对象通过valueOf()方法转换,如果valueOf()返回值不是原始值再使用toString()方法转换。
在对象转换为原始值后,如果两个操作数都是字符串,将依次比较每个字符串的Unicode大小。
在对象转换为原始值后,如果至少有一个操作数不是字符串,那么两个操作数都将转换为数字进行比较,如果其中某个操作数无法转换为数字,这个操作数将转换为NaN,比较结果为false。
“*”、“/”、“%”、“!”
“*”、“/”、“%”会把操作数转换为数字(转不了的转成NaN)
“!”会把操作数转换为布尔值
篇8:Redis数据类型学习
Redis是一款开源,高性能键-值存储(key-value store).它的键值可以包括字符串(strings)类型,同时它还包括哈希(hashes),列表(lists),集合(sets)等数据类型.对于这些数据类型,可以执行原子操作.例如:对字符串进行附加操作(append);递增哈希中的值;向列表中增加元素;计算集合的交集,并集与差集等.
经常有人拿memcached和redis做比较.下面简单看下他们之间有哪些差别:
1.网络IO模型
memcached是多线程,非阻塞IO复用的网络模型.多线程模型可以发回多核作用,但有时也带来性能损耗.
redis使用单线程的IO复用模型.自己封装了一个简单的AeEvent事件处理框架,主要实现了epoll,kqueue和select,对于单纯只有IO操作来说,单线程可以将速度优势发挥到最大,但是一些操作,如排序,聚合等,单线程模型实际会严重影响整体吞吐量.
2.内存管理
memcached使用预分配的内存池的方式.能省去申请释放内存的开销,减小内存碎片产生,但这种方式也会带来一定程度上的空间浪费.数据也可能被剔除.
redis使用现场申请内存的方式来存储数据.优化内存分配,非临时数据永远不会被剔除,即便物理内存不够.这点redis更适合作为存储而不是cache
3.存储方式
memcached基本只支持简单的key-value存储,不支持枚举,不支持持久化和复制等功能.
redis除key/value之外,还支持list,set,sorted,hash等数据结构.同时还支持持久化和复制等功能.
如果希望数据不被剔除,或者需要key-value之外更多数据类型支持时,使用redis更适合.
下面安装Redis.
1.下载redis redis-2.4.14.tar.gz code.google.com/p/redis/downloads/list
01
root@10.1.1.45:~# ls -l redis-2.4.14.tar.gz
02
-rw-r--r-- 1 root root 627494 -05-08 16:16 redis-2.4.14.tar.gz
03
root@10.1.1.45:~# tar xf redis-2.4.14.tar.gz
04
root@10.1.1.45:~# cd redis-2.4.14/
05
root@10.1.1.45:redis-2.4.14# ll
06
total 84
07
-rw-rw-r-- 1 root root 12105 -05-23 17:32 00-RELEASENOTES
08
-rw-rw-r-- 1 root root 55 2012-05-23 17:32 BUGS
09
-rw-rw-r-- 1 root root 671 2012-05-23 17:32 CONTRIBUTING
10
-rw-rw-r-- 1 root root 1487 2012-05-23 17:32 COPYING
11
drwxrwxr-x 5 root root 4096 2012-05-23 17:32 deps
12
-rw-r--r-- 1 root root 25 2013-05-08 16:15 dump.rdb
13
-rw-rw-r-- 1 root root 30 2012-05-23 17:32 INSTALL
14
-rw-rw-r-- 1 root root 397 2012-05-23 17:32 Makefile
15
-rw-rw-r-- 1 root root 2813 2012-05-23 17:32 README
16
-rw-rw-r-- 1 root root 21094 2012-05-23 17:32 redis.conf
17
篇9:Sybase的数据类型
在创建表或声明局部变量时,必须使用Sybase系统预定义类型,
1.字符类型
Char(n) VarChar(n)
2.数值类型
整数类型——Integer SmallInt TinyInt
浮点类型——Real Float Number[P,S] Decimal[P,S]
货币类型——Money SmallMoney
3.日期/时间类型
Datetime SmallDatetime
两者时间部分的精度不同,前者精确到分,后者精确到1/30秒,
4.文本和图像类型
Text Image
5.二进制数据类型
Binary(n) VarBinary(n)
篇10:Lua的编译、执行和调试技术介绍
这篇文章主要介绍了Lua的编译、执行和调试技术介绍,本文着重讲解了对错误的处理,另外也讲解了编译和执行等知识,需要的朋友可以参考下
dofile读入文件编译并执行,真正完成功能的函数是loadfile;与dofile不同,loadfile仅仅是编译代码成中间码,并且把编译后的chunk作为函数返回,如果发生错误,返回nil和错误信息。我们可以这么定义dofile:
代码如下:
function dofile(filename)
local f = assert(loadfile(filename))
return f
end
如果你只调用一次,可以使用dofile(filename),如果是调用多次,可以f = loadfile(filename); f();f()...
loadstring与loadfile相似,只不过他是从一个串中读入。
lua中函数定义发生在运行时而不是编译时。
代码如下:
f = loadstring(“i=i+1”)
与f = function() i = i+1 end等价。但loadstring不关心词法范围:
i = 33
local i = 0;
f = loadstring(“i=i+1”)
g = function() i = i+1 end
g使用的是局部变量i,而f使用的是全局变量i,因为f总是在全局环境下编译。
犯错是人的本性,因此我们必须以最佳的方式来处理错误,
lua作为扩展语言,经常嵌入到其他应用,当错误发生时,不能简单的crash或exit。
代码如下:
print “enter a number:”
n = io.read(“*number”)
if not n then error(“invalid input”) end
if not condition then error end 的组合太普遍了以至于lua专门内建了一个函数来做这工作,这个函数就是assert。
通常,当异常发生时,你有两个方式处理,要么返回错误码(nil),要么报错(error)。对于这两种方式,并没有固定的准则来做选择。但是我们提供通用的原则:容易避免的异常应该报错,否则返回异常。举例说明:
math.sin接受个number型的弧度值,如果参数不是number,我们应该报错,而不是返回错误码。假设我们是返回错误码,那么我们使用就得这样:
代码如下:
local res = math.sin(x)
if not res then
其实,我们可以很容易地检测这个异常,在调用sin之前:
代码如下:
if not tonumber(x) then
通常,我们是既不检测sin的参数,也不检测sin的返回值。如果参数不是number,往往是我们代码自身出问题了。这种情况下,停止执行并报错是最简单也是最实用的方式。
相反的,io.open这个函数,就不存在简单的在调用open之前就检测出异常的方法。打开失败可能是因为文件不存在,或权限不够。通过返回错误码,你可以采用适当的方式来处理,比如让用户输入另一个文件名。
篇11:Lua教程(三):值与类型介绍
这篇文章主要介绍了Lua教程(三):值与类型介绍,本文起讲解了Lua的八种基本类型、userdata、thread、table等内容,需要的朋友可以参考下
Lua 是一种 动态类型语言, 这意味着变量没有类型,只有值才有类型。 语言中不存在类型定义。而所有的值本身携带它们自己的类型信息。
Lua 中的所有值都是一致 (first-class) 的。 这意味着所有的值都可以被放在变量里,当作参数传递到另一个函数中,并被函数作为结果返回。
Lua 中有八种基本类型: nil, boolean, number, string, function, userdata, thread, and table. Nil 类型只有一种值 nil ,它的主要用途用于标表识和别的任何值的差异; 通常,当需要描述一个无意义的值时会用到它。 Boolean 类型只有两种值:false 和 true。 nil 和 false 都能导致条件为假;而另外所有的值都被当作真。 Number 表示实数(双精度浮点数)。 (编译一个其它内部数字类型的 Lua 解释器是件很容易的事;比如把内部数字类型改作 单精度浮点数或长整型。参见文件 luaconf.h 。) String 表示一串字符的数组。 Lua 是 8-bit clean 的: 字符串可以包含任何 8 位字符, 包括零结束符 (‘ ′) (参见 §2.1)。
Lua 可以调用(和处理)用 Lua 写的函数以及用 C 写的函数(参见 §2.5.8).
userdata 类型用来将任意 C 数据保存在 Lua 变量中。 这个类型相当于一块原生的内存,除了赋值和相同性判断,Lua 没有为之预定义任何操作。 然而,通过使用 metatable (元表) ,程序员可以为 userdata 自定义一组操作 (参见 §2.8)。 userdata 不能在 Lua 中创建出来,也不能在 Lua 中修改,
这样的操作只能通过 C API。 这一点保证了宿主程序完全掌管其中的数据。
thread 类型用来区别独立的执行线程,它被用来实现 coroutine (协同例程)(参见 §2.11)。 不要把 Lua 线程跟操作系统的线程搞混。 Lua 可以在所有的系统上提供对 coroutine 的支持,即使系统并不支持线程。
table 类型实现了一个关联数组。也就是说, 数组可以用任何东西(除了nil)做索引,而不限于数字。 table 可以以不同类型的值构成;它可以包含所有的类型的值(除 nil 外)。 table 是 lua 中唯一的一种数据结构;它可以用来描述原始的数组、符号表、集合、 记录、图、树、等等。 用于表述记录时,lua 使用域名作为索引。 语言本身采用一种语法糖,支持以 a.name 的形式表示 a[“name”]。 有很多形式用于在 lua 中创建一个 table (参见 §2.5.7)。
跟索引一样, table 每个域中的值也可以是任何类型(除 nil外)。 特别的,因为函数本身也是值,所以 table 的域中也可以放函数。 这样 table 中就可以有一些 methods 了 (参见see §2.5.9)。
table, function ,thread ,和 (full) userdata 这些类型的值是所谓的对象: 变量本身并不会真正的存放它们的值,而只是放了一个对对象的引用。 赋值,参数传递,函数返回,都是对这些对象的引用进行操作; 这些操作不会做暗地里做任何性质的拷贝。
库函数 type 可以返回一个描述给定值的类型的字符串。
Lua 提供运行时字符串到数字的自动转换。 任何对字符串的数学运算操作都会尝试用一般的转换规则把这个字符串转换成一个数字。 相反,无论何时,一个数字需要作为字符串来使用时,数字都会以合理的格式转换为字符串。 需要完全控制数字怎样转换为字符串,可以使用字符串库中的 format 函数 (参见 string.format)。
篇12:Lua基本语法
Lua是相当简单易学,本篇文章来给大家稍微讲一下Lua的语法,不会长篇累牍得把Lua的所有语法都讲一遍,这里通过以下几点来讲Lua语言的基础语法,
1 简介
由 clean C 实现。需要被宿主程序调用,可以注入 C 函数。
2 语法约定
Lua 的语法基于 BNF 的语法规则。
Lua 对大小写敏感。
2.1 保留关键字
C 语言中没有的关键字有:
代码如下:
and elseif function
in nil local not or
repeat then until
规范:全局变量以下划线开头。
2.2 操作符
C 语言中没有的操作符:
^
~=
// -- 向下取整
Lua 中没有的操作符:
+=
-=
2.3 字符串定义
采用转义符:通过转义符表示那些有歧义的字符
字符表示
a -- 代表字符 a
97 -- 代表字符 a