04、Lua 数据类型

Lua 数据类型

  • Lua 数据类型
  • nil(空)
  • boolean(布尔)
  • number(数字)
  • string(字符串)
  • table(表)
  • function(函数)
  • thread(线程)
  • userdata(自定义类型)

Lua 数据类型

Lua是动态类型语言,变量不要类型定义,只需要为变量赋值。 值可以存储在变量中,作为参数传递或结果返回。
Lua中有8个基本类型分别为:nil、boolean、number、string、userdata、function、thread和table。

数据类型描述
nil这个最简单,只有值nil属于该类,表示一个无效值(在条件表达式中相当于false)
boolean包含两个值:false和true
number表示双精度类型的实浮点数
string字符串由一对双引号或单引号来表示
function由 C 或 Lua 编写的函数
userdata表示任意存储在变量中的C数据结构
thread表示执行的独立线路,用于执行协同程序
tableLua 中的表(table)其实是一个关联数组(associative arrays),数组的索引可以是数字或者是字符串。在 Lua 里,table 的创建是通过构造表达式来完成,最简单构造表达式是{},用来创建一个空表。

我们可以使用 type函数 测试给定变量或者值的类型:

print(type("Hello world"))      --> string
print(type(10.4*3))             --> number
print(type(print))              --> function
print(type(type))               --> function
print(type(true))               --> boolean
print(type(nil))                --> nil
print(type(type(X)))            --> string

nil(空)

nil类型表示一种没有任何有效值,它只有一个值 — nil,例如打印一个没有赋值的变量,便会输出一个nil值:

> print(type(a))
nil
>

对于全局变量和 tablenil 还有一个删除作用,给全局变量或者 table 表里的变量赋一个 nil 值,等同于把它们删掉,执行下面代码就知:

tab1 = { key1 = "val1", key2 = "val2", "val3" }
for k, v in pairs(tab1) doprint(k .. " - " .. v)
endtab1.key1 = nil
for k, v in pairs(tab1) doprint(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) thenprint("false and nil are false!")
elseprint("other is true!")
end

以上代码执行结果如下:

$ lua test.lua 
boolean
boolean
nil
false and nil are false!

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))

运行实例 »
以上代码执行结果:

number
number
number
number
number
number

string(字符串)

字符串由一对双引号或单引号来表示。

string1 = "this is string1"
string2 = 'this is string2'

也可以用 2 个方括号 [[]] 来表示一块字符串。

html = [[
<html>
<head></head>
<body><a href="//www.w3cschool.cn/">w3cschoolW3Cschool教程</a>
</body>
</html>
]]
print(html)

以下代码执行结果为:

<html>
<head></head>
<body><a href="//www.w3cschool.cn/">w3cschoolW3Cschool教程</a>
</body>
</html>

在对一个数字字符串上进行算术操作时,Lua 会尝试将这个数字字符串转成一个数字:

> print("2" + 6)
8.0
> print("2" + "6")
8.0
> print("2 + 6")
2 + 6
> print("-2e2" * "6")
-1200.0
> print("error" + 1)
stdin:1: attempt to perform arithmetic on a string value
stack traceback:stdin:1: in main chunk[C]: in ?
> 

以上代码中”error” + 1执行报错了,字符串连接使用的是 .. ,如:

> print("a" .. 'b')
ab
> print(157 .. 428)
157428
> 

使用 # 来计算字符串的长度,放在字符串前面,如下实例:

> len = "www.w3cschool.cn"
> print(#len)
16
> print(#"www.w3cschool.cn")
16
> 

table(表)

在Lua 里,table 的创建是通过 构造表达式 来完成,最简单构造表达式是{},用来创建一个空表。也可以在表里添加一些数据,直接初始化表:

-- 创建一个空的 table
local tbl1 = {}-- 直接初始表
local tbl2 = {"apple", "pear", "orange", "grape"}

Lua中的表(table)其实是一个 关联数组(associative arrays),数组的索引可以是数字或者是字符串。

-- table_test.lua 脚本文件
a = {}
a["key"] = "value"
key = 10
a[key] = 22
a[key] = a[key] + 11
for k, v in pairs(a) doprint(k .. " : " .. v)
end

脚本执行结果为:

$ lua table_test.lua 
key : value
10 : 33

不同于其他语言的数组把 0 作为数组的初始索引,在 Lua 里表的默认初始索引一般以 1 开始。

-- table_test2.lua 脚本文件
local tbl = {"apple", "pear", "orange", "grape"}
for key, val in pairs(tbl) doprint("Key", key)
end

脚本执行结果为:

$ lua table_test2.lua 
Key 1
Key  2
Key  3
Key  4

table 不会固定长度大小,有新数据添加时 table 长度会自动增长,没初始的 table 都是 nil。

-- table_test3.lua 脚本文件
a3 = {}
for i = 1, 10 doa3[i] = i
end
a3["key"] = "val"
print(a3["key"])
print(a3["none"])

脚本执行结果为:

$ lua table_test3.lua 
val
nil

function(函数)

在Lua 中,函数是被看作是第一类值(First-Class Value),函数可以存在变量里:

-- function_test.lua 脚本文件
function factorial1(n)if n == 0 thenreturn 1elsereturn n * factorial1(n - 1)end
end
print(factorial1(5))
factorial2 = factorial1
print(factorial2(5))

脚本执行结果为:

$ lua function_test.lua 
120
120

function 可以以匿名函数(anonymous function)的方式通过参数传递:

-- function_test2.lua 脚本文件
function anonymous(tab, fun)for k, v in pairs(tab) doprint(fun(k, v))end
end
tab = { key1 = "val1", key2 = "val2" }
anonymous(tab, function(key, val)return key .. " = " .. val
end)

脚本执行结果为:

$ lua function_test2.lua 
key1 = val1
key2 = val2

thread(线程)

在Lua 里,最主要的线程是协同程序(coroutine)。它跟线程(thread)差不多,拥有自己独立的栈、局部变量和指令指针,可以跟其他协同程序共享全局变量和其他大部分东西。

线程跟协程的区别:线程可以同时多个运行,而协程任意时刻只能运行一个,并且处于运行状态的协程只有被挂起(suspend)时才会暂停。

userdata(自定义类型)

userdata 是一种用户自定义数据,用于表示一种由应用程序或 C/C++ 语言库所创建的类型,可以将任意 C/C++ 的任意数据类型的数据(通常是 struct 和 指针)存储到 Lua 变量中调用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/770509.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

目标跟踪研究

我以前以为是靠高帧率实现目标识别的,现在才意识到目标跟踪也扮演着重要的角色 目录 1.目标跟踪问题简述2. 目标追踪综述3.目标跟踪-匈牙利匹配4.目标追踪-距离计算5.待续1.目标跟踪问题简述 目标跟踪 要实现跟踪,也就是需要了解前后帧之间的关系,那自然需要一个队列来保存…

vue中动态路由是什么该如何实现

在 Vue 中&#xff0c;动态路由是指根据不同的参数或条件&#xff0c;生成不同的路由配置。实现动态路由可以通过以下步骤&#xff1a; 1. **定义动态路由规则**&#xff1a; - 在路由配置文件&#xff08;通常是 router/index.js&#xff09;中&#xff0c;使用路由的 pat…

Typora结合PicGo + Github搭建个人图床

目录 一 、GitHub仓库设置 1、新建仓库 2、创建Token 并复制保存 二、PicGo客户端配置 1、下载 & 安装 2、配置图床 三、Typora配置 一 、GitHub仓库设置 1、新建仓库 点击主页右上角的 号创建 New repository 填写仓库信息 2、创建Token 并复制保存 点击右上角…

神经网络深度学习梯度下降算法优化

【神经网络与深度学习】以最通俗易懂的角度解读[梯度下降法及其优化算法]&#xff0c;这一篇就足够&#xff08;很全很详细&#xff09;_梯度下降在神经网络中的作用及概念-CSDN博客 https://blog.51cto.com/u_15162069/2761936 梯度下降数学原理

JavaSE(上)-Day10

JavaSE&#xff08;上&#xff09;-Day10 多态多态中成员变量的调用多态中成员方法的调用多态的优缺点 包final关键字权限访问修饰符代码块 多态 什么是多态&#xff1a;对象的多种形态多态的前提是&#xff1a;有继承或实现关系&#xff1b;子类重写父类的方法&#xff0c;父…

QGraphicsView实现图片放大、缩小、鼠标拖动、以鼠标点放大缩小

1. 工程配置文件 pro 1 QT core gui2 3 greaterThan(QT_MAJOR_VERSION, 4): QT widgets4 5 CONFIG c116 7 # The following define makes your compiler emit warnings if you use8 # any Qt feature that has been marked deprecated (the exact warnings9 # depend…

使用免费ChatGPT提升工作效率

ChatGPT无限次数: 点击直达 智能工作利器ChatGPT&#xff1a;提升工作效率 在当今信息爆炸的时代&#xff0c;快速高效地撰写论文对于科研工作者来说至关重要。智能工具ChatGPT的出现为我们提供了强大的支持&#xff0c;它不仅能够提升工作的效率&#xff0c;还能够帮助我们更…

Oracle 使用PLSQL 导出 一个表的insert 语句

1. 使用工具 plsql 的方法,如图示 2. 操作界面(按ctrl键鼠标可多选表) 3. 然后就看到了插入语句 原文&#xff1a;https://www.cnblogs.com/jinanxiaolaohu/p/9192766.html

基于直方图相似性的图像分类算法FPGA实现,包括tb测试文件和MATLAB辅助验证

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 MATLAB测试结果&#xff1a; FPGA测试结果&#xff1a; 上述仿真图中&#xff0c;红色XX表示图像读取完毕。因此输出XX。当图像输出完成之后&…

Elasticsearch 索引模板、生命周期策略、节点角色

简介 索引模板可以帮助简化创建和二次配置索引的过程&#xff0c;让我们更高效地管理索引的配置和映射。 索引生命周期策略是一项有意义的功能。它通常用于管理索引和分片的热&#xff08;hot&#xff09;、温&#xff08;warm&#xff09;和冷&#xff08;cold&#xff09;数…

科技类媒体邀约资源有哪些?科技公司做活动如何做好宣传?

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 科技类媒体邀约资源包括了各类专注于科技报道的平台和渠道&#xff0c;科技公司可以通过多样化的宣传策略来提升活动的影响力。 科技类媒体资源的邀约通常涉及多种不同的平台和形式&…

基于nodejs+vue高校自习室预约系统的设计与实现python-flask-django-php

本系统在设计过程中&#xff0c;很好地发挥了该开发方式的优势&#xff0c;让实现代码有了良好的可读性&#xff0c;而且使代码的更新和维护更加的方便&#xff0c;操作简单&#xff0c;对以后的维护减少了很多麻烦。系统的顺利开发和实现&#xff0c;对于高校自习室预约这一方…

命令模式(请求与具体实现解耦)

目录 前言 UML plantuml 类图 实战代码 模板 Command Invoker Receiver Client 前言 命令模式解耦了命令请求者&#xff08;Invoker&#xff09;和命令执行者&#xff08;receiver&#xff09;&#xff0c;使得 Invoker 不再直接引用 receiver&#xff0c;而是依赖于…

msvcp100.dll是什么东西?电脑msvcp100.dll丢失的六种解决方法

最近&#xff0c;我在电脑上打开一款软件时&#xff0c;遇到了一个问题&#xff1a;找不到msvcp100.dll丢失问题&#xff0c;为了解决这个问题&#xff0c;我进行了深入的学习和研究&#xff0c;并在此分享msvcp100.dll丢失的解决方法。 一&#xff0c;msvcp100.dll是什么&…

AI:133-基于深度学习的工业质检自动化

AI&#xff1a;133-基于深度学习的工业质检自动化 1.背景介绍 随着工业自动化水平的不断提高&#xff0c;工业质检成为了一个重要的环节。传统的工业质检主要依靠人工进行&#xff0c;不仅效率低下&#xff0c;而且容易受到主观因素的影响。近年来&#xff0c;随着深度学习技…

Visual Studio QT6 工程引入组件模块,例如:QtXml

QT 工程引入 QtXml QT 版本 6.6.1 Visual Studio 版本 Microsoft Visual Studio Community 2022 (64 位) - Current 版本 17.7.5 打开 Visual Studio 项目工程选择 工具栏 - 扩展 - QT VS Tools -Qt Project Settings 勾选 xml 后点击确定 点击应用即可 注意&#xff1a;配置环…

Apache Dolphinscheduler - 执行工作流却没有创建任务实例分析

问题描述 最近碰到一个奇怪的问题&#xff0c;DS 创建工作流成功&#xff0c;但是一旦执行&#xff0c;始终在转&#xff0c;而且没有任何执行的痕迹&#xff0c;后来到数据库一查发现压根没创建任务实例。 我们都知道一个工作流里面可以挂多个任务节点&#xff0c;执行工作流…

Windows蓝牙驱动开发之模拟HID设备(二)(把Windows电脑模拟成蓝牙鼠标和蓝牙键盘等设备)

by fanxiushu 2024-03-24 转载或引用请注明原作者 接上文,当我们建立了蓝牙链接请求之后,就该传输数据了, 其实传输数据比起上章阐述的创建SDP和建立连接要简单许多。 使用类型 BRB_L2CA_ACL_TRANSFER 的BRB请求,就可以实现接收和发送操作, 至于具体是接收还是发送,根据设…

Python 全栈体系【四阶】(十九)

第五章 深度学习 一、基本理论 4. 神经网络的改进 4.3 循环神经网络 4.3.1 标准 CNN 模型的不足 假设数据之间是独立的。标准 CNN 假设数据之间是独立的&#xff0c;所以在处理前后依赖、序列问题&#xff08;如语音、文本、视频&#xff09;时就显得力不从心。这一类数据…

华为校招机试 - 计算座位最大利用数(20240320)

题目描述 一列具有 m 个座位的火车,从起点到终点共停靠 n 个站点,站点编号从 0 到 n - 1。 发车前有 x 名乘客预定了座位,因为预定数量可能超出座位数,为了保证效率最大化,请计算如何分配才能是座位利用率最大,并输出最大的座位利用数。 说明: 座位利用数定义为每个座…