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 = [[

<html>

<head></head>

<body>

<a href="http://jb51.net/">just a link</a>

</body>

</html>

]]

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 变量中调用。

lua的数据类型的更多相关文章

  1. Lua学习----Lua基础数据类型

    前言 Lua有6中数据类型,分别是nil(空).boolean(布尔).number(数字).string(字符).table(表).function(函数) 在Lua中可以使用type函数来返回一个 ...

  2. 02.Lua的数据类型

    简单认识Lua 百度了一下(偷哈懒就不自己写了) Lua 是一个小巧的脚本语言.是巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de Janei ...

  3. lua通用数据类型

    TValue结构 TValue这个结构体是Lua的通用结构体,,Lua中的所有的数据都可以使用这个结构体来表示.很容易想到,在面向对象中,这个结构体是一个基类,派生出来的都是其他的子类. TValue ...

  4. Lua学习笔记(1): HelloWorld和数据类型

    Lua是一个轻量级的脚本语言,由c语言编写,容易嵌入到应用中,深受游戏开发者的青睐 环境安装 选用SciTE作为lua的IDE 可以在github找到这个开源的软件 SciTE下载链接 安装好之后打开 ...

  5. lua数据类型的的操作(三)

    上一章我们学习了lua的数据类型,以及语法的定义,今天我们学习lua的数据类型操作,其实就是lua库一些api的操作,遇到对数据类型处理时,可以根据lua库提供的操作来实现. 一.字符串操作 1.字符 ...

  6. Lua 与 Redis

    Lua 与 Redis 标签: Java与NoSQL 从 2.6版本 起, Redis 开始支持 Lua 脚本 让开发者自己扩展 Redis - 案例-实现访问频率限制: 实现访问者 $ip 在一定的 ...

  7. lua 入门学习

    -- 1.Hello world print( "--------------1--------------") print("Hello world"); - ...

  8. Lua 架构 The Lua Architecture

    转载自:http://magicpanda.net/2010/10/lua%E6%9E%B6%E6%9E%84%E6%96%87%E6%A1%A3/ Lua架构文档(翻译) 十 102010 前段时间 ...

  9. Redis进阶实践之七Redis和Lua初步整合使用

    一.引言        Redis学了一段时间了,基本的东西都没问题了.从今天开始讲写一些redis和lua脚本的相关的东西,lua这个脚本是一个好东西,可以运行在任何平台上,也可以嵌入到大多数语言当 ...

随机推荐

  1. redis的主从复制原理

    1. 前言 和MySQL主从复制的原因一样,Redis虽然读取写入的速度都特别快,但是也会产生读压力特别大的情况.为了分担读压力,Redis支持主从复制,Redis主从复制可以根据是否是全量分为全量同 ...

  2. Nginx数据结构之散列表

    1. 散列表(即哈希表概念) 散列表是根据元素的关键码值而直接进行访问的数据结构.也就是说,它通过把关键码值映射到表中一个位置来访问记录, 以加快查找速度.这个映射函数 f 叫做散列方法,存放记录的数 ...

  3. 用Qt生成dll类库及调用方法

    空白工程新建DLL后,将DLL和LIB文件放入需要调用的“指定目录” 项目->属性->连接器->常规->附加库目录->添加“指定目录” 项目->属性->连接器 ...

  4. 封装带SSH跳板机的REDIS

    一.封装ssh的redis 二.setting的配置 三.应用示例 import redis from sshtunnel import SSHTunnelForwarder from conf.se ...

  5. spring + mybatis + mysql/oracle开发

    1)创建一个spring-mybatis-mysql这么一个javaweb或java工程 2)导入spring-ioc,spring-aop,spring-transaction,mybatis,c3 ...

  6. [Java复习] Java基础 Basic

    Q1面向对象 类.对象特征? 类:对事物逻辑算法或概念的抽象,描述一类对象的行为和状态. OOP三大特征,封装,继承,多态 封装:隐藏属性实现细节,只公开接口.将抽象的数据和行为结合,形成类.目的是简 ...

  7. Python Flask,cookie,session ,设置、获取、删除

    使用Response类的set_cookie()方法可以设置cookie: Response.set_cookie( key, //键 value='', //值 max_age=None, //秒为 ...

  8. c/c++编码规范(2)--作用域

    2. 作用域 静止使用class类型的静态或全局变量. 6. 命名约定 6.1. 函数名,变量名,文件名要有描述性,少用缩写. 6.2. 文件命名 6.2.1. 文件名要全部用小写.可使用“_”或&q ...

  9. tcp协议相关概念

    conv 会话IDmtu 最大传输单元mss 最大分片大小state 连接状态(0xFFFFFFFF表示断开连接)snd_una 第一个未确认的包snd_nxt 待发送包的序号rcv_nxt 待接收消 ...

  10. Android OKHttp 可能你从来没用过的拦截器 【实用推荐】

    前言 在平时开发中,你有没有下面这样的困扰呢? 场景一 明明是服务端的接口数据错误,而QA(测试)第一个找到的可能是客户端开发的你,为什么这个页面出现错误了? 而作为客户端开发的你,可能要拿出测试机连 ...