【CS.PL】Lua 编程之道: 基础语法和数据类型 - 进度16%
2 初级阶段 —— 基础语法和数据类型
文章目录
- 2 初级阶段 —— 基础语法和数据类型
- 2.0 关键字(keywords) 🔥
- 2.1 注释与标识符
- 2.1.1 注释
- 2.1.2 标识符
- 2.2 变量与赋值
- 2.2.1 所有变量默认是全局变量 ≠ local, 有一个例外
- 2.2.2 local变量是局部变量, 以end作为边界
- 2.2.3 多个变量同时赋值且变量没有类型, 只是一个引用
- 2.2.4 用全局变量给局部变量赋值
- 2.3 数据类型:数字、字符串、布尔值
- 2.3.1 数值类型
- 2.3.2 字符串 —— `#`获取长度/`..`连接符 🔥
- 2.3.3 只有nil和boolean的false会使条件表达式为假, 0或""都会判为真
- 2.4 运算符和表达式
- 2.4.0 算数运算符
- 2.4.1 逻辑运算符`and`/`or`/`not`
- 2.4.2 比较运算符 `==` / `~=` / `>` / `<` / `>=` / `<=`
- 2.4.2 特殊的表达式
- 往期回顾
2.0 关键字(keywords) 🔥
The following keywords are reserved and cannot be used as names:
| and | break | do | else | elseif | end | false |
| for | function | if | in | local | nil | not |
| or | repeat | return | then | true | until | while |
Lua 与 C++对比:
do ... end相当于{ ... },用于代码块的定义。- 除非声明为
local,否则变量不以do ... end区分生命周期,默认都是全局变量。 - 只有
nil和布尔类型的false会使条件表达式为假,0或""都会判为真。 - 语法糖:
lhs and rhs:如果lhs为真,返回rhs;如果lhs为假,返回lhs。lhs or rhs:如果lhs为真,返回lhs;如果lhs为假,返回rhs。
2.1 注释与标识符
2.1.1 注释
在 Lua 中,注释用于对代码进行解释说明,而不会被实际执行。Lua 支持两种注释形式:
- 单行注释:使用两个连字符
--开头,后面跟着注释内容。 - 多行注释:使用两个连续的方括号
--[[开头,以及两个连续的方括号--]]结尾,之间是注释内容。
-- 这是单行注释--[[
这是
多行
注释
--]]
2.1.2 标识符
在 Lua 中,标识符用于命名变量、函数和其他数据。标识符的命名规则如下:
- 以字母(大小写均可)或下划线
_开头,后面可以跟字母、数字和下划线。 - Lua 是区分大小写的,因此
myVar和myvar是不同的标识符。
2.2 变量与赋值
2.2.1 所有变量默认是全局变量 ≠ local, 有一个例外
print(daokeke) -- nil
do daokeke= "myself" -- 所有变量默认是全局变量
end
print(daokeke) -- myself
except:
for i = 1, 5 do -- 这个i为局部变量 print(i)
end
print(i) -- nil
2.2.2 local变量是局部变量, 以end作为边界
print(daokeke) -- nil
do local daokeke= "myself" -- local变量是局部变量
end
print(daokeke) -- nil
2.2.3 多个变量同时赋值且变量没有类型, 只是一个引用
local x, y = 10, 20
x, y = y, x -- 先取值, 再赋值, 效率不高, 但是写法简单, 不需手动引入第三个变量
print(x, y) -- 20 10x = "a"
y = "b"
print(x, y) -- a ba = 1,2,3
print(a) -- 1
a,b = 1,2,3
print(a, b) -- 1 2
a,b,c = 1,2,3
print(a, b, c) -- 1 2 3
2.2.4 用全局变量给局部变量赋值
print(daokeke) -- nil
daokeke= "good!"
do local daokeke= daokeke-- 用全局变量给局部变量赋值 daokeke= "boy!" print(daokeke) -- boy!
end
print(daokeke) -- good!
2.3 数据类型:数字、字符串、布尔值
2.3.1 数值类型
不区分整形(32bit)和浮点型, 认为全部都是浮点型即可(64bit); 可以完全当成计算器来用
print(type(123)) -- number
print(type(3.14)) -- number
print(type(2.99e10)) -- numberprint(1/2) -- 0.5
print(2^0.5) -- 1.4142135623731
print(12345 == 1.2345e4) -- true
2.3.2 字符串 —— #获取长度/..连接符 🔥
单引号/双引号都可以, 根据内容自由选择
Ref. [[1000.03.CS.PL-Lua-Lua字符串的实现及其编码实践]]
print("I am so cool!")
print("\"I am so cool!\"she said") -- "I am so cool!"she said
print('"I am so cool!"she said') -- "I am so cool!"she said-- [[ 后跟换行, 会保留到内容中
ctx = [[
"I'm so cool!"she said]]
print(ctx) -- "I'm so cool!"she said-- 可以自定义界定符, 任意数量=号都可以, 比如包含65535(高版本更多)以内的html
ctx = [===["I'm so cool!"she said]===]
print(ctx) -- "I'm so cool!"she said
print(#ctx) -- 22
print(ctx.." with smiles.") -- "I'm so cool!"she said with smiles.
2.3.3 只有nil和boolean的false会使条件表达式为假, 0或""都会判为真
-- 只有`nil`和boolean type中的`false`会使条件表达式为假, 0或""都会判为真
print(type(nil)) -- nil
print(type(true)) -- boolean
2.4 运算符和表达式
2.4.0 算数运算符
Lua 支持常见的算术运算符,如 +、-、*、/ 等。
+:加法-:减法*:乘法/:除法%:取模(求余数)^:幂运算
print(5 + 3) -- 8
print(5 - 3) -- 2
print(5 * 3) -- 15
print(5 / 3) -- 1.6666666666667
print(5 % 3) -- 2
print(5 ^ 3) -- 125
2.4.1 逻辑运算符and/or/not
-- 语法糖: lhs and rhs ==> 如果lhs为真, 返回rhs; 如果lhs为假, 返回lhs
print(0 and 123) -- 123
print(nil and 123) -- nil
print(false and 123) -- false -- 语法糖: lhs or rhs ==> 如果lhs为真, 返回lhs; 如果lhs为假, 返回rhs
print(0 or 123) -- 0
print(nil or 123) -- 123
print(false or 123) -- 123print(false or nil) -- nil
print(not nil) -- true
print(not 0) -- false
2.4.2 比较运算符 == / ~= / > / < / >= / <=
比较:
print(5 == 5) -- true
print(5 ~= 5) -- false
print(5 > 3) -- true
print(5 < 3) -- false
print(5 >= 5) -- true
print(5 <= 5) -- true
2.4.2 特殊的表达式
初始化:
-- x = x1 or {xx} x1存在, x为x1;否则为{}
a = a1 or 0
print(a) -- 0
三目运算符A?B:C:
-- 已知B为真, A真 -> A and B -> B, B or C -> B; A假 -> A and B -> A, B or C -> Ca = true
b = "yes"
c = "no"
result = a and b or c
print(result) -- "yes"a = false
result = a and b or c
print(result) -- "no"
这样,我们在 Lua 中通过一些技巧也能实现类似其他语言的三目运算符功能。这种表达方式非常简洁,但在使用时要确保 B 永远为真,否则会返回意想不到的结果。
往期回顾
【CS.PL】Lua 编程之道: 简介与环境设置 - 进度8%
相关文章:
【CS.PL】Lua 编程之道: 基础语法和数据类型 - 进度16%
2 初级阶段 —— 基础语法和数据类型 文章目录 2 初级阶段 —— 基础语法和数据类型2.0 关键字(keywords) 🔥2.1 注释与标识符2.1.1 注释2.1.2 标识符 2.2 变量与赋值2.2.1 所有变量默认是全局变量 ≠ local, 有一个例外2.2.2 local变量是局部变量, 以end作为边界2.…...
centos7 xtrabackup mysql 基本测试(3)---虚拟机环境 安装mysql
centos7 xtrabackup mysql 基本测试(3)—虚拟机环境 安装mysql centos7 安装 mysql5.7 可以在运行安装程序之前导入密钥: sudo rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022第一步、下载MySQL 安装包: sudo w…...
Java Native Interface 使用指南
我们知道Java本身的实现,很大一部分是用C写的。实际上,Java也允许我们和原生平台的代码进行交互。 Java定义了一个接口规范,就叫做Java Native Interface,通过这个接口规范,我们就可以让Java代码运行原生平台的代码。…...
代码随想录算法训练营第三十九天 | 62.不同路径、63. 不同路径 II、343. 整数拆分、96.不同的二叉搜索树
62.不同路径 题目链接:https://leetcode.cn/problems/unique-paths/ 文档讲解:https://programmercarl.com/0062.%E4%B8%8D%E5%90%8C%E8%B7%AF%E5%BE… 视频讲解:https://www.bilibili.com/video/BV1ve4y1x7Eu/ 思路 确定dp数组以及下标的含…...
C/C++函数指针、C#委托是什么?
函数指针 #include<stdio.h>//声明函数指针 typedef int(*Calc)(int a, int b); int Add(int a, int b) {return a b; } int Sub(int a, int b) {return a - b; }int main() {Calc funcPoint1 &Add;Calc funcPoint2 ⋐int x 120;int y 140;int z 0;z …...
红队攻防渗透技术实战流程:组件安全:JacksonFastJsonXStream
红队攻防渗透实战 1. 组件安全1.1 J2EE-组件Jackson-本地demo&CVE1.1.1 代码执行 (CVE-2020-8840)1.1.2 代码执行(CVE-2020-35728)1.2 J2EE-组件FastJson-本地demo&CVE1.2.1 FastJson <= 1.2.241.2.2 FastJson <= 1.2.471.2.3 FastJson <= 1.2.801.3 J2EE-组…...
Perl 语言学习进阶
一、如何深入 要深入学习Perl语言的库和框架,可以按照以下步骤进行: 了解Perl的核心模块:Perl有许多核心模块,它们提供了许多常用的功能。了解这些模块的功能和用法是深入学习Perl的第一步。一些常用的核心模块包括:S…...
LangGraph实战:从零分阶打造人工智能航空客服助手
❝ 通过本指南,你将学习构建一个专为航空公司设计的客服助手,它将协助用户查询旅行信息并规划行程。在此过程中,你将掌握如何利用LangGraph的中断机制、检查点技术以及更为复杂的状态管理功能,来优化你的助手工具,同时…...
R可视化:R语言基础图形合集
R语言基础图形合集 欢迎大家关注全网生信学习者系列: WX公zhong号:生信学习者Xiao hong书:生信学习者知hu:生信学习者CDSN:生信学习者2 基础图形可视化 数据分析的图形可视化是了解数据分布、波动和相关性等属性必…...
mysql导入sql文件失败及解决措施
1.报错找不到表 1.1 原因 表格创建失败,编码问题mysql8相较于mysql5出现了新的编码集 1.2解决办法: 使用vscode打开sql文件ctrlh,批量替换,替换到你所安装mysql支持的编码集。 2.timestmp没有设置默认值 Error occured at:20…...
JS:获取鼠标点击位置
一、获取鼠标在目标元素中的点击位置 getClickPos.ts: export const getClickPos (e: MouseEvent) > {return {x: e.offsetX,y: e.offsetY,}; };二、获取鼠标在页面中的点击位置 getClickPos.ts: export const getPageClickPos (e: MouseEvent) > {return {x: e.pa…...
使用开源的zip.cpp和unzip.cpp实现压缩包的创建与解压(附源码)
目录 1、使用场景 2、压缩包的创建 3、压缩包的解压 4、CloseZipZ和CloseZipU两接口的区别...
npm 异常:peer eslint@“>=1.6.0 <7.0.0“ from eslint-loader@2.2.1
node 用16版本 npm install npm6.14.15 -g将版本降级到6...
Docker|了解容器镜像层(2)
引言 容器非常神奇。它们允许简单的进程表现得像虚拟机。在这种优雅的底层是一组模式和实践,最终使一切运作起来。在设计的根本是层。层是存储和分发容器化文件系统内容的基本方式。这种设计既出人意料地简单,同时又非常强大。在今天的帖子[1]中…...
使用Python爬取temu商品与评论信息
【🏠作者主页】:吴秋霖 【💼作者介绍】:擅长爬虫与JS加密逆向分析!Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长期坚守并致力于Python与爬虫领域研究与开发工作! 【&…...
mybatis学习--自定义映射resultMap
1.1、resultMap处理字段和属性的映射关系 如果字段名和实体类中的属性名不一致的情况下,可以通过resultMap设置自定义映射。 常规写法 /***根据id查询员工信息* param empId* return*/ Emp getEmpByEmpId(Param("empId") Integer empId);<select id…...
Elasticsearch之写入原理以及调优
1、ES 的写入过程 1.1 ES支持四种对文档的数据写操作 create:如果在PUT数据的时候当前数据已经存在,则数据会被覆盖,如果在PUT的时候加上操作类型create,此时如果数据已存在则会返回失败,因为已经强制指定了操作类型…...
python中装饰器的用法
最近发现装饰器是一个非常有意思的东西,很高级! 允许你在不修改函数或类的源代码的情况下,为它们添加额外的功能或修改它们的行为。装饰器本质上是一个接受函数作为参数的可调用对象(通常是函数或类),并返…...
php实现一个简单的MySQL分页
一、案例演示: 二、php 代码 <?php $servername "localhost"; // MySQL服务器名称或IP地址 $username "root"; // MySQL用户名 $password "123456"; // MySQL密码 $dbname "test"; // 要连接…...
算法训练营day23补签
题目1:530. 二叉搜索树的最小绝对差 - 力扣(LeetCode) class Solution { public:int reslut INT_MAX;TreeNode* pre NULL;void trackingback(TreeNode* node) {if(node NULL) return;trackingback(node->left);if(pre ! NULL) {reslut…...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...
【网络】每天掌握一个Linux命令 - iftop
在Linux系统中,iftop是网络管理的得力助手,能实时监控网络流量、连接情况等,帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...
Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误
HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...
MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...
8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...
全球首个30米分辨率湿地数据集(2000—2022)
数据简介 今天我们分享的数据是全球30米分辨率湿地数据集,包含8种湿地亚类,该数据以0.5X0.5的瓦片存储,我们整理了所有属于中国的瓦片名称与其对应省份,方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...
Python实现prophet 理论及参数优化
文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...
Robots.txt 文件
什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...
面向无人机海岸带生态系统监测的语义分割基准数据集
描述:海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而,目前该领域仍面临一个挑战,即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...
