1.介绍
LUA程序语言,它是一种动态(弱)类型的语言,没有类型定义的语法,它包含八种不同的基本(原子)类型
[
nill空,boolean布尔,number数字,string串,userdata用户自定义数据,function函数,thread线程,talbe表
],
每一个变量都可以包含任何类型(举例如下)。
比如,v = 'abc‘ -- 将V初置值为字符串‘abc’
print(type(v)) -->'string' ,type是一个lua 自带的函数,作用跟JAVASCRIPT里边的type函数,返回传入参数的类型字符串,所以下面的print(type(type(v)))结果是‘string’
v = nill --v重新置值为nill
print(type(v)) -->'nill'
print(type(type(v)))-->'string'
Lua将函数function作为第一类值处理,可以像操作其他值一样来处理函数值,如下
v = print --将函数掼针置给变量v
v(type(v))--'function' ,等价于print(type(print))
2.详细介绍8种数据类型
2.1 nil
删除一个全局变量时,只需要将变量置为nill即可,nill只有一个值,表示一种‘无效值’的意义,被视为‘假’,在lua里,只有nill,false被视为‘假’其他一律都视为‘真’
2.2 boolean
只有true和false 两种状态,在lua,并不是只有boolean可以作为条件值的唯一表示形式,所以类型的值都可以作为条件判断,如上面所说的,只有nill,false被视为‘假’其他一律都视为‘真’
2.3number
数字类型,用于表示实数。LUA并没有整数类型,只是用双精度浮点数作表示一个整数,(可以通过修改LUA发行版本目录下的luaconf.h,重新compile lua源码,可以使用其他类型如double,float类型)
合法的数字常量如:8 8.8 8.808e-8 0.8e3 5e+30等
2.4string
2.4.1
lua字符串,表示一个字符序列,采用8-bit coding,字符中的字符可以是任何数值编码,如0,即可以将二进制数据存到一个字符串里。
2.4.2
lua的字符串,是一种不可变的值,不能修改其中的某个或某些字符,修改只能通过创建新的变量来存修改后的字符串,原来的字符串并不会被修改,如下例
a = "this is the first string"--lua字符串常量可以用双引或单引号界定,与javascript语言一样
b = string.gsub(a,'first','second')--创建新变量b来存修改后的字符串,string.gsub表示调用string table里边的gsub方法,该方法表示将用seconde,替换掉原串当中的first
print(a) -->"this is the first string"
print(b) --"this is the second string"
2.4.3 转义序列
跟C语言差不多,LUA有自己的转义序列, 如\a \b \f \n \r \t \ddd \odd \xdd等
除了‘单引号,“双引号外,还可以[[ string content ]]类似块注释的方式来界定字符串,这种方式不会解释string content里边的转义序列字符,如果第一行为空白行,将会被忽略,如下
stringValue = [[
--空白行,将被忽略
<html>
<head>
<title>lua test</title>
</head>
<body>
asdf;js\nt\tafksa
;jafdaa'\'
</body>
</html>
]]
除了[[ string content ]]这种形式,有时为了怕字符串被当作注释给注释掉,所以建议以下面的形式块界定
[--{n}[ string content ]--{n}]
注:--{n},如n=1,[--{n}[ string content ]--{n}] 相当于 [-[ string content ]-];n=2,则表示[--[ string content ]--],依次类推
2.4.4 字符串与数字的算术运算转换
lua提拱了运行时数字与字符串的自动转换,当然有时候会出报错,只有当字符串是“数字类弄型值”,才能自动转换算成功
如: print('88'+8);-->96,将string 类型转成number类型 ,最后计算88+*=96
print(type('88'+8));-->number
print("-8.1e+8"*2)-->16.2e+8
但当字符串不是“数字类弄型值”,如‘hello’
print('hello'+1)--出错了
2.4.5字符串连接符 ..
用于连接字符串与字符串,数字与数字,以及数字与字符串
print('hello'..' world')--> hello world
print(20..12) -->报错了,如果第一个是数字,不在.与数字之间加一空间,lua解释会将.解释成数字的小数,所以只需要在第一个数字与.之间加一空格即可
print('hello'..2012) -->hello2012
通过..连接成后,数据类型变成string
print(type(20..12)) --> 'string'
2.4.6 字符串与数字类型的互相转换
lua提供tonumber()方法,可以将“数字类弄型值”的字符串变量变成数字类型,如果转换失败会返回nil;
除了以上介绍的。。字符串连接符外,LUA提供tostring()方法也可以将数字类型转成string
2.4.7 求字符串长度#
直接例子
a = 'hello'
print(#a);-->5
print(#'helloworld')-->10
2.5 table
2.5.1
作为LUA的核心数据类型,table类型实现了动态(长度可变性)“关联数组”,一种具有特列索引的关联数组,不仅可以通过整数索引,还可以用其他基本类型的值(除NIL外)去索。
2.5.2
table可以表示普通数组,符号表,集合,记录,队列和其他数据结构。(table普通数组/线性表,通常以1为索引开始值)
在lua当中,table起着相当重要的作用,lua用table 表示模块,包,还用对象。简单地说明,如io.read,表示用read去索引 io模块的read函数,io表示输入输出模块。
table 的创建不需要声明,只需要通过construtor expression来完成,如 a = {}就定义了一个空表。看下面例子
t = {} --创建一个空表t
k = 'fuck' --定义一个字符串变量,并置值
t[k] = 'you' --为t表添加新索引k,并置值 key='fuck' ,value='you',用字符串索引
t[8] = ‘happy’ --新添加索引8, 用数字索引
print(t['fuck']) -->fuck
print(t[8])-->happy
k = 8
print(t[k])-->happy
lua中的table 永远是匿名的,持有table的变量与它自身没有固定的关联,table变量相当于java当中的引用,举例
a = {} --创建空表
a['aven'] = 2012--添加索引条目
b = a --将b也指向a所指向的table
print(b['aven']) -->2012
删除table,只需要将其置为nil即可
接上面,a = nil--现在只有b引用table了。
2.5.3
lua提供了“语法糖”,对于t['key'],可以简化为t.key 这样的写法,然而,并不是所有的t['key']等价于t.key;只有当table表的索引是字符串类型值时,才可以用点语法的形式简化写法,如果是数字类型的话,则不行。
最后要提一下a.x 与a[x]的区别:前者以'x'作为table a表的索引,而后都以变量x的值为索引,举例
k = 'key'
t = {}
t[k] = 'value'
print(t[k]) -->value ,等价于print(k['key'])
print(t.k) --报错了,找不到'k'这个字符串,如果将第一行代码,改成k= 'k',则此处不报错
梦之幻时尚睡衣纺
http://shop.paipai.com/442560143
2.5.4
综合举例操作table
1.读取 文件前十行,保存到t表当中
方法一:
t = {}
for i=1,10 do
t[i] = io.read()
end
方法二:
t = {}
for i =1,10 do
t[#t+1] = io.read()
end --利用#长度计算符
2.将上例当中的最后一行置换成别的新值,如‘fuck you’
t[#t] = nil
t[#t+1] = 'fuck you'
2.5.5
table是可变大小的,但是其大小的概念比较模糊
t = {}
t[10000] = 8;
上面的t表出现了空隙,在lua 的table当中,所有未初始化的变量的索引结果都是nil,所以前面1-9999都是nil,而#长度运算符只求出到,第一个为nil前面的数组的长,所以上面的#t = 0,lua提供table.maxn(t)可以求出最大正索引数,所以上面的table.maxn(t)确良=10000
最后, 可以通过if(#t ==table.maxn(t))来判断该 t表是否存在空隙。
2.6 function
前面讲到,lua将function作为first-class value来处理,如a = print a(type(a)) 等价于print(type(print))
lua即可以调用lua编写的函数,也可以调用标C语言写的函数,LUA库是用C写的,后面将介绍各种常见库,如io/os/math/debugger等
关于函数的介绍,将在下面进行深入学习
2.7userdata & thread
讲到协同的时候,我们再讲thread
而userdata,是用来定义将C语言数据保存到LUA变量当中的,它是一种新型类型,如在标准I/O库内,用userdata 表示文件。
下一节,将讲解--表达式与语句(expression & statement)
LUA技术交流群,请加Q群:139315537,加入请注明来源。
分享到:
相关推荐
- **函数与类型**:如`lua_call`、`lua_type`等。 这些API函数覆盖了Lua解释器的核心功能,如栈操作、错误处理、表操作等。通过这些API,开发者可以构建强大的Lua/C混合应用。 综上所述,Lua不仅是一种灵活且功能...
一个完整的Lua程序可以看作是一个“chunk”,通常是指从文件读取的代码或者作为字符串传递给 `load` 函数的代码。 ###### 2.4.2 语句块 可以使用花括号 `{}` 来分组语句,构成语句块。 ###### 2.4.3 赋值 Lua...
LUA的设计哲学强调简单性与灵活性,使得开发者能够轻松地将其集成到现有的应用程序中。 #### 三、LUA基础语法 ##### 1. 注释 在LUA中,注释是必不可少的部分,用于提高代码的可读性和维护性。LUA支持两种注释方式...
Lua的设计初衷是易于嵌入其他应用程序中,为这些程序提供灵活的扩展能力。 #### 二、Lua基本语法介绍 ##### 1. 注释 - 单行注释:使用 `--` 开头直到行尾。 - 多行注释:使用 `--[[` 开始并以 `]]` 结束。 - Lua中...
Lua的核心概念包括值与类型、环境与全局环境、错误处理、元表及元方法、垃圾收集等。Lua是一种动态类型语言,它支持多种数据类型,包括nil、boolean、number、string、userdata、function、thread和table。其中table...
- **Chunk(语句组)**:Lua程序是由一系列语句组成的,这些语句称为chunk。 - **语句块**:由多个语句组成的代码块,可以用`do...end`包围。 - **赋值**:可以给一个或多个变量赋值,如`a = 10`。 - **控制结构**:...
Luajit IO 是一个纯 Lua 的 IO 框架,提供 C 的高效率,简单但强大的设计,得益于 luajit 这个 JIT 引擎。可用来开发 TCP/UDP 服务器程序。下面是连接 redis 的示例代码:local ffi = require"ffi" local null...
XLUA是一款用于Unity游戏开发的高性能Lua绑定框架,它能够实现C#与Lua脚本之间的高效交互,适用于那些需要脚本化逻辑的游戏或应用程序。XLUA的核心优势在于其运行效率高、易用性强且扩展性良好。 #### 二、主要类及...
2. **轻量级**:jsmn.lua的实现非常小巧,不依赖其他大型库,便于集成到各种项目中。 3. **易用性**:虽然jsmn本身是C语言实现,但移植到Lua后,保留了简单直观的API,使得Lua开发者可以轻松地理解和使用。 4. **...
- **Type**: 返回给定键所储存的值的类型。 ##### 3.2 服务器相关命令 - **Ping**: 测试与服务器的连接。 - **Echo**: 将给定字符串值原样返回。 - **Select**: 选择数据库。 - **Quit**: 断开连接并退出客户端。 -...
- **TYPE**:返回给定键所储存的值的类型。 **3.2 服务器相关命令** - **PING**:测试客户端与服务器的连接。 - **ECHO**:返回客户端发送给服务器的任何字符串。 - **SELECT**:选择数据库。 - **QUIT**:关闭连接...
- **type**: 获取键的类型。 ##### 3.2 服务器相关命令 - **ping**: 测试连接是否正常。 - **echo**: 输出给定的字符串。 - **select**: 切换当前数据库。 - **quit**: 断开客户端连接。 - **dbsize**: 返回当前...
- **TYPE** 返回键的类型。 ##### 3.2 服务器相关命令 - **PING** 测试服务器是否响应。 - **ECHO** 返回给定的字符串。 - **SELECT** 切换当前数据库。 - **QUIT** 断开客户端连接。 - **DBSIZE** 返回当前数据库...
`HMSET key field1 value1 [field2 value2 ...]`:同时将多个域值对设置到哈希表键`key`中。 ##### 2.3.4 hget `HGET key field`:获取哈希表键`key`中域`field`的值。 ##### 2.3.5 hmget `HMGET key field1 ...
- **返回给定key的value类型**:使用`TYPE key`命令获取key所存储的值的类型。 - **返回从当前数据库中随机选择的一个key**:使用`RANDOMKEY`命令随机返回一个key。 - **原子的重命名一个key**:使用`RENAME key ...
2. **命令发送**:使用`redisCommand()`函数发送Redis命令,如`SET key value`、`GET key`等。这个函数会将命令字符串转换为 Redis 协议格式并发送,然后返回一个回复对象。 3. **命令回复处理**:`redisReply`...
local data = {key1="value1", key2="value2"} local body = json.encode(data) local url = "http://api.example.com/endpoint" local response, code, headers = http.request{ url = url, method = "POST",...