Lua数据类型介绍

时间:2022-08-18 08:18:54 其他范文 收藏本文 下载本文

Lua数据类型介绍(共16篇)由网友“落难王八邓超元”投稿提供,下面小编给大家带来Lua数据类型介绍,希望能帮助到大家!

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

49       -- 代表数字字符 1

其他转义符表示

n        -- 代表字符串 n

n         -- 代表换行

注意数字字符必须是三位。其他字符则不能超过三位。

采用长括号:长括号内的所有内容都作为普通字符处理。

[[]]       -- 0级长括号

[==[]==]   -- 2级长括号

3 值与类型

Lua 是动态语言,变量没有类型,值才有。值自身携带类型信息。

Lua 有八种基本数据类型:nil, boolean, number, string, function, userdata, thread, table。

仅 nil 和 false 导致条件为假,其他均为真。

userdata 类型变量用于保存 C 数据。 Lua 只能对该类数据进行使用,而不能进行创建或修改,保证宿主程序完全掌握数据。

thread 用于实现协程(coroutine)。

table 用于实现关联数组。table 允许任何类型的数据做索引,也允许任何类型做 table 域中的值(前述

任何类型 不包含 nil),

table 是 Lua 中唯一的数据结构。

由于函数也是一种值,所以 table 中可以存放函数。

function, userdata, thread, table 这些类型的值都是对象。这些类型的变量都只是保存变量的引用,并且在进行赋值,参数传递,函数返回等操作时不会进行任何性质的拷贝。

库函数 type 返回变量的类型描述信息。

3.1 强制转换

Lua 提供数字与字符串间的自动转换。

可以使用 format 函数控制数字向字符串的转换。

4 变量

变量有三种类型:全局变量、局部变量、表中的域。

函数外的变量默认为全局变量,除非用 local 显示声明。函数内变量与函数的参数默认为局部变量。

局部变量的作用域为从声明位置开始到所在语句块结束(或者是直到下一个同名局部变量的声明)。

变量的默认值均为 nil。

代码如下:

a = 5              -- 全局变量

local b = 5    -- 局部变量

function joke()

c = 5          -- 局部变量

local d = 6 -- 局部变量

end

print(c,d)     --> nil nil

do

local a = 6 -- 局部变量

b = 6          -- 全局变量

print(a,b); --> 6 6

end

print(a,b)     --> 5 6

方便标记,--> 代表前面表达式的结果。

4.1 索引

对 table 的索引使用方括号 []。Lua使用语法糖提供 . 操作。

t[i]

t.i                -- 当索引为字符串类型时的一种简化写法

gettable_event(t,i) -- 采用索引访问本质上是一个类似这样的函数调用

4.2 环境表

所有全局变量放在一个环境表里,该表的变量名为 _env 。对某个全局变量 a 的访问即 _env.a (_env_ 只是为了方便说明)。

每个函数作为变量持有一个环境表的引用,里面包含该函数可调用的所有变量。

子函数会从父函数继承环境表。

可以通过函数 getfenv / setfenv 来读写环境表。

以上所述就是本文的全部内容了,希望大家能够喜欢。

篇13:微型计算机的基本数据类型

微型计算机的基本数据类型

高级语言中有多种数据类型,如带符号整数、无符号整数、长整数、实型数、长实型数、字符型等,这里所介绍的数据类型是基于数据的位宽,不考虑编程语言中的实际内涵,它们是字节、字、双字和四字。

在微型计算机中一个8位的二进制数据称为一个字节(Byte);一个16位的二进制数据称为一个字(Word),字可以看成由两个字节数据所组成;一个32位的二进制数据称为一个双字(DoubleWord),双字可以看成由两个字或4个字节所组成;一个64位的二进制数据称为一个四字(QuadWord),同样,四字可以看成由两个双字或4个字或8个字节所组成,

在存储器中一个存储单元可以存放一个字节数据,因此,上面四种类型的数据在存储器中存放时分别占用1个、2个、4个和8个存储单元,如果超过一个存储单元,则这些单元必须是相邻的,或者说一个数据必须放在相邻的存储单元中。在x86体系微型计算机(采用:Intelx86系列或兼容的CPU)中,每种数据类型的最低的一个字节总是存放在较低地址处,然后向地址增加方向按顺序依次排列,如图1.13所示。通常将数据最低一个字节所在存储单元的地址说成是该数据的地址。

篇14:笔试题基本数据类型

笔试题(基本数据类型)

JAVA:

基本数据类型和类封装器的知识

基本数据类型的默认值

Overloading和overriding

JNI是什么?有什么特点?

看代码确定是编译期错误还是执行期错误

多线程中Thread和runnable的实现和使用

数据提升和cast

有效的.标识符

String的实例个数

==和equals的区别

同步锁

Notify和sleep的作用,区别

抽象类和interface

Try catch finally throwable throw的区别和用法

结合命令行参数考java数组的定义和使用

Celi,floor,abs,round的用法

篇15:uniqueidentifier 数据类型数据库教程

数据|数据类型

想要产生这种唯一标识的格式的数据:

6F9619FF-8B86-D011-B42D-00C04FC964FF

应该怎么做呢?

================================================================

答:

uniqueidentifier 数据类型可存储 16 字节的二进制值,其作用与全局唯一标识符 (GUID) 一样,GUID 是唯一的二进制数;世界上的任何两台计算机都不会生成重复的 GUID 值。GUID 主要用于在拥有多个节点、多台计算机的网络中,分配必须具有唯一性的标识符。

uniqueidentifier 列的 GUID 值通常通过下列方式之一获取:

在 Transact-SQL 语句、批处理或脚本中调用 NEWID 函数。

在应用程序代码中,调用返回 GUID 的应用程序 API 函数或方法。

Transact-SQL NEWID 函数以及应用程序 API 函数和方法用它们的网卡的标识号加上 CPU 时钟的唯一编号来生成新的 uniqueidentifier 值。每个网卡都有唯一的标识号。NEWID 返回的 uniqueidentifier 值是通过使用服务器上的网卡而生成的。应用程序 API 函数和方法返回的 uniqueidentifier 值是通过使用客户端中的网卡而生成的。

uniqueidentifier 值通常不定义为常量。您可以按下列方式指定 uniqueidentifier 常量:

字符串格式:'6F9619FF-8B86-D011-B42D-00C04FC964FF'

二进制格式:0xff6f868b11d0b42d00c04fc964ff

uniqueidentifier 数据类型不会按照 IDENTITY 属性的方式为插入的行自动生成新的 ID。例如,若要获取新的 uniqueidentifier 值,则表必须具有指定 NEWID 函数或 NEWSEQUENTIALID 函数的 DEFAULT 子句,或 INSERT 语句必须使用 NEWID 函数。

CREATE TABLE MyUniqueTable

(UniqueColumn  UNIQUEIDENTIFIER     DEFAULT NEWID,

Characters     VARCHAR(10) )

GO

INSERT INTO MyUniqueTable(Characters) VALUES ('uiok')

INSERT INTO MyUniqueTable VALUES (NEWID(), 'uiok')

GO

注意:

您可以使用 NEWSEQUENTIALID 生成 GUID 以减少叶级别索引上的页争用,

NEWSEQUENTIALID 只能与 uniqueidentifier 类型的表列的 DEFAULT 约束一起使用。

uniqueidentifier 列中可以多次出现某个 uniqueidentifier 值,除非对该列也指定了 UNIQUE 或 PRIMARY KEY 约束。当多个行引用源表中的同一个主键时,引用其他表中 uniqueidentifier 主键的外键列中可以多次出现各个 uniqueidentifier 值。

一个表可以有多个 uniqueidentifier 列。每个表中可以指定一个具有 ROWGUIDCOL 属性的 uniqueidentifier 列。ROWGUIDCOL 属性指明此列的 uniqueidentifier 值可唯一地标识表中的行。但是,属性不会执行任何强制实现唯一性的操作。必须使用其他机制强制实现唯一性,例如指定列的 PRIMARY KEY 约束。ROWGUIDCOL 属性主要用于 Microsoft SQL Server 复制。具有更新订阅的合并复制和事务复制使用 uniqueidentifier 列来确保在表的多个副本中唯一地标识行。

uniqueidentifier 数据类型具有下列缺点:

值长且难懂。这使用户难以正确键入它们,并且更难记住。

这些值是随机的,而且它们不支持任何使其对用户更有意义的模式。

也没有任何方式可以决定生成 uniqueidentifier 值的顺序。它们不适用于那些依赖递增的键值的现有应用程序。

当 uniqueidentifier 为 16 字节时,其数据类型比其他数据类型(例如 4 字节的整数)大。这意味着使用 uniqueidentifier 键生成索引的速度相对慢于使用 int 键生成索引的速度。

在不要求全局唯一性或首选使用按序列增加的键时,请考虑使用 IDENTITY 属性。

篇16:跟我学SQL:串行数据类型

SQL的数据类型决定了一个字段的内容在数据库中会被如何处理、存储和显示,SQL92定义了标准的数据类型,目的是给数据库制造商建立自己的数据类型提供蓝图。在前面的文章中,我们介绍了一些常用的数据类型,这些数据类型分为四大类:

串行

数值

日期时间

区间型

本文将向你概述这些数据类型在数据库中是如何使用的,然后着重解释串行数据类型。这些信息可以作为有用的参考,或者作为关于某个数据库制造商具体产品中数据类型的背景知识。

使用数据类型

当你在数据库中创建了一个表格,你就定义了每列的名字以及要输入到这些列中的内容的数据类型。从先前的文章中借用一个例子:

CREATE TABLE Products

(prod_id INT(16)AUTO_INCREMENT, prod_color VARCHAR(20),

prod_descr VARCHAR(255), prod_size DECIMAL(8,2),

UNIQUE (`prod_id`));

在以上的查询中,定义行prod_color VARCHAR(20)发出指令要创建一个列,名字是prod_color,数据类型是VARCHAR,长度为20。

你的数据库使用和每个类型相关的描述符来区别数据类型。例如,VARCHAR数据类型的描述符所含的信息将它区别为串行数据型,它包含所有的串字符,其长度是可变的。数据库里列的定义还包含了其他信息,例如对应于数据类型的特定长度。

如前所述,每个数据库制造商都希望在SQL92定义的标准上建立自己的数据类型。这样每个数据库在定义数据类型时都能够设定自己所需要的最大容量限制和其他属性。许多数据库使用的数据类型名字和这里列出来的一样,尽管每种的实现方法都有微小的差别。要确定特定数据类型使用方法的细节最好的方法还是查阅数据库制造商的文档。

已经说过了,希望对标准字符串数据类型有更多的了解就往下看。

有两种主要的串行数据类型:字符和位。串行使用数据库里由SQL_TEXT所定义的字符。SQL_92标准同时还提供了NATIONAL CHARACTER(国家字符集)和NATIONAL CHARACTER VARYING(国家字符集变体),这两者都能使用可定义字符集。后者的处理方法和CHARACTER以及CHARACTER VARYING类型一样。

CHARACTER | CHAR

使用方法:CHARACTER(clength) | CHAR(clength)

CHARACTER和CHAR这两个关键字是相同的。

CHARACTER类型一个突出的特点是它们能够包含这个字符。

CHARACTER 类型包含了固定长度的串字符(来自SQL_TEXT的语言集),clength。

字符在值的长度小于clength时起填充作用,

这表示CHARACTER字段的长度是固定的。

你可以把CHARACTER的数据类型字段和相同类型的其他允许不同长度的字段比较,或者和CHARACTER VARYING 数据类型比较。

有些数据库允许和数值数据类型比较。

CHARACTER VARYING | CHAR VARYING | VARCHAR

使用方法:CHARACTER VARYING(maxlength) | CHAR VARYING(maxlength) | VARCHAR(maxlength)

CHARACTER VARYING,CHAR VARYING,和VARCHAR这几个关键字是相同的。

这些类型能容纳最大长度的字符串,maxlength。

数据库把字段的长度作为值的实际长度。

你可以把这些数据类型的字段和相同类型的其他允许不同最大长度的字段比较。

BIT

使用方法:BIT(blength)

这种类型包含了带有长度的位字符(1和0),blength。例如,如果我们使用BIT(2),样本值将为“01”。

有的数据库会在串的开头插入空位,其的则会填充它们以符合固定长度的要求。

位字符是串,不是整数。

你可以把BIT数据类型的字段与相同类型的允许不同长度的其它字段比较,或者和BIT VARYING数据类型比较。

有些数据库允许BITS和CHARACTER或者INTEGER类型比较。

BIT VARYING

使用方法: BIT VARYING(maxlength)

这种类型包含了最大长度的位字符,maxlength。

所记录的长度被设为值的实际长度。

数据库允许和其的BIT VARYING数据字段比较,或者和BIT的数据字段比较。

对我们的SQL系列有了一些了解了吗?

请把你的评论、问题或者回应发到下面的讨论栏,或者如果你有关于SQL基础系列的论题,可以发到我们编辑的信箱。

串理论

数据库生产商通过建立这些基础的数据类型来创建你实际要实现的数据类型。对于字符串,这就可能包括相同名字的(不同)类型,例如CHAR或BIT,或者扩展到包括TEXT,SMALL TEXT,以及包含字符串的其他数据类型。

数据从一个数据库迁移到另一个数据库时,这种设计上的弹性产生了一个必须克服的障碍。在一个数据库里,你可能会有一个叫做CHAR的类型,这个类型所允许的最大容量大于你要迁移到的数据库的最大容量。而且,(SQL92)标准中没有明确定义的类型可能会变化较大,这样的话只用遵从惯例来简化迁移。

在ZDNet China最近的文章《BLOB移植的替换方案》中讨论了存在数据类型移植问题时保护数据的一个可能的解决方案。SQL标准没要包括存储二进制数据的指标,这造成了不同数据库制造商产品间的不兼容。软件开发者必须找到提到方案列清除这些障碍。

在这个系列的下一篇文章中,我们会看看SQL92的数字数据类型,每个有什么特点,以及对要实现这些类型的数据库的要求。

Lua教程(十七):C API简介

Lua时间转化的几个小例子

Lua 学习笔记之C API 遍历 Table实现代码

C语言sprintf与sscanf函数

flex 遍历Object对象内容的实现代码

c语言函数知识点总结

程序开发中异常的理解及处理异常论文

nosql数据库 tiger

C语言中函数的返回值

第六章 计划与计划工作 学习笔记

Lua数据类型介绍
《Lua数据类型介绍.doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

【Lua数据类型介绍(共16篇)】相关文章:

Lua的编译、执行和调试技术介绍2022-08-06

蛋白项目开发员求职简历2023-06-20

详解Lua中repeat...until循环语句的使用方法2024-04-09

cgd是什么文件,cgd文件用什么程序打开2023-02-26

FreePOPs实现Gmail客户端收信2022-11-13

理科毕业生简历自我评价2023-10-13

统计核算员个人工作总结2022-11-29

关于创业时机的文章2023-09-29

收信日记2022-06-11

数据统计研发实习生简历2022-12-13

点击下载本文文档