当前位置: 首页 > news >正文

【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:

andbreakdoelseelseifendfalse
forfunctionifinlocalnilnot
orrepeatreturnthentrueuntilwhile

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 是区分大小写的,因此 myVarmyvar 是不同的标识符。

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) &#x1f525;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 基本测试&#xff08;3&#xff09;—虚拟机环境 安装mysql centos7 安装 mysql5.7 可以在运行安装程序之前导入密钥&#xff1a; sudo rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022第一步、下载MySQL 安装包&#xff1a; sudo w…...

Java Native Interface 使用指南

我们知道Java本身的实现&#xff0c;很大一部分是用C写的。实际上&#xff0c;Java也允许我们和原生平台的代码进行交互。 Java定义了一个接口规范&#xff0c;就叫做Java Native Interface&#xff0c;通过这个接口规范&#xff0c;我们就可以让Java代码运行原生平台的代码。…...

代码随想录算法训练营第三十九天 | 62.不同路径、63. 不同路径 II、343. 整数拆分、96.不同的二叉搜索树

62.不同路径 题目链接&#xff1a;https://leetcode.cn/problems/unique-paths/ 文档讲解&#xff1a;https://programmercarl.com/0062.%E4%B8%8D%E5%90%8C%E8%B7%AF%E5%BE… 视频讲解&#xff1a;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 &Sub;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语言的库和框架&#xff0c;可以按照以下步骤进行&#xff1a; 了解Perl的核心模块&#xff1a;Perl有许多核心模块&#xff0c;它们提供了许多常用的功能。了解这些模块的功能和用法是深入学习Perl的第一步。一些常用的核心模块包括&#xff1a;S…...

LangGraph实战:从零分阶打造人工智能航空客服助手

❝ 通过本指南&#xff0c;你将学习构建一个专为航空公司设计的客服助手&#xff0c;它将协助用户查询旅行信息并规划行程。在此过程中&#xff0c;你将掌握如何利用LangGraph的中断机制、检查点技术以及更为复杂的状态管理功能&#xff0c;来优化你的助手工具&#xff0c;同时…...

R可视化:R语言基础图形合集

R语言基础图形合集 欢迎大家关注全网生信学习者系列&#xff1a; WX公zhong号&#xff1a;生信学习者Xiao hong书&#xff1a;生信学习者知hu&#xff1a;生信学习者CDSN&#xff1a;生信学习者2 基础图形可视化 数据分析的图形可视化是了解数据分布、波动和相关性等属性必…...

mysql导入sql文件失败及解决措施

1.报错找不到表 1.1 原因 表格创建失败&#xff0c;编码问题mysql8相较于mysql5出现了新的编码集 1.2解决办法&#xff1a; 使用vscode打开sql文件ctrlh&#xff0c;批量替换&#xff0c;替换到你所安装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)

引言 容器非常神奇。它们允许简单的进程表现得像虚拟机。在这种优雅的底层是一组模式和实践&#xff0c;最终使一切运作起来。在设计的根本是层。层是存储和分发容器化文件系统内容的基本方式。这种设计既出人意料地简单&#xff0c;同时又非常强大。在今天的帖子[1]中&#xf…...

使用Python爬取temu商品与评论信息

【&#x1f3e0;作者主页】&#xff1a;吴秋霖 【&#x1f4bc;作者介绍】&#xff1a;擅长爬虫与JS加密逆向分析&#xff01;Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长期坚守并致力于Python与爬虫领域研究与开发工作&#xff01; 【&…...

mybatis学习--自定义映射resultMap

1.1、resultMap处理字段和属性的映射关系 如果字段名和实体类中的属性名不一致的情况下&#xff0c;可以通过resultMap设置自定义映射。 常规写法 /***根据id查询员工信息* param empId* return*/ Emp getEmpByEmpId(Param("empId") Integer empId);<select id…...

Elasticsearch之写入原理以及调优

1、ES 的写入过程 1.1 ES支持四种对文档的数据写操作 create&#xff1a;如果在PUT数据的时候当前数据已经存在&#xff0c;则数据会被覆盖&#xff0c;如果在PUT的时候加上操作类型create&#xff0c;此时如果数据已存在则会返回失败&#xff0c;因为已经强制指定了操作类型…...

python中装饰器的用法

最近发现装饰器是一个非常有意思的东西&#xff0c;很高级&#xff01; 允许你在不修改函数或类的源代码的情况下&#xff0c;为它们添加额外的功能或修改它们的行为。装饰器本质上是一个接受函数作为参数的可调用对象&#xff08;通常是函数或类&#xff09;&#xff0c;并返…...

php实现一个简单的MySQL分页

一、案例演示&#xff1a; 二、php 代码 <?php $servername "localhost"; // MySQL服务器名称或IP地址 $username "root"; // MySQL用户名 $password "123456"; // MySQL密码 $dbname "test"; // 要连接…...

算法训练营day23补签

题目1&#xff1a;530. 二叉搜索树的最小绝对差 - 力扣&#xff08;LeetCode&#xff09; 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…...

国密SM2JS加密后端解密

1.前端加密 前端加密开源库 sm-crypto 1.1 传统web,下载 sm-crypto 进行打包为 dist/sm2.js 相关打包命令 npm install --save sm-crypto npm install npm run prepublish在web页面引用打包后的文件 <script type"text/javascript" src"<%path %>…...

Cheat Engine.exe修改植物大战僵尸阳光与冷却

Cheat Engine.exe修改植物大战僵尸阳光与冷却 打开Cheat Engine.exe和植物大战僵尸&#xff0c;点CE中文件下面红框位置&#xff0c;选择植物大战僵尸&#xff0c;点击打开 修改冷却&#xff1a; 等冷却完毕&#xff0c;首次扫描0安放植物&#xff0c;再次扫描变动值等冷却完…...

python内置模块之queue(队列)用法

queue是python3的内置模块&#xff0c;创建堆栈队列&#xff0c;用来处理多线程通信&#xff0c;队列对象构造方法如下&#xff1a; queue.Queue(maxsize0) 是先进先出&#xff08;First In First Out: FIFO&#xff09;队列。 入参 maxsize 是一个整数&#xff0c;用于设置…...

Spring Security——结合JWT实现令牌的验证与授权

目录 JWT&#xff08;JSON Web Token&#xff09; 项目总结 新建一个SpringBoot项目 pom.xml PayloadDto JwtUtil工具类 MyAuthenticationSuccessHandler&#xff08;验证成功处理器&#xff09; JwtAuthenticationFilter&#xff08;自定义token过滤器&#xff09; W…...

Vector的底层结构剖析

vector的介绍&#xff1a; 1.Vector实现了List接口的集合。 2.Vector的底层也是一个数组,protected Object[] elementData; 3.Vector 是线程同步的&#xff0c;即线程安全&#xff0c;Vector类的操作方法带有Synchronized. 4.在开发中&#xff0c;需要线程同步时&#xff0…...

实现抖音视频滑动功能vue3+swiper

首先,你需要安装和引入Swiper库。可以使用npm或者yarn进行安装。 pnpm install swiper然后在Vue组件中引入Swiper库和样式。 // 导入Swiper组件和SwiperSlide组件,用于创建轮播图 import {Swiper, SwiperSlide } from swiper/vue; // 导入Swiper的CSS样式,确保轮播图的正确…...

Linux文件系统【真的很详细】

目录 一.认识磁盘 1.1磁盘的物理结构 1.2磁盘的存储结构 1.3磁盘的逻辑存储结构 二.理解文件系统 2.1如何管理磁盘 2.2如何在磁盘中找到文件 2.3关于文件名 哈喽&#xff0c;大家好。今天我们学习文件系统&#xff0c;我们之前在Linux基础IO中研究的是进程和被打开文件…...

JAVA学习笔记DAY5——Spring_Ioc

文章目录 Bean配置注解方式配置注解配置文件调用组件 注解方法作用域 DI注入注解引用类型自动装配文件结构自动装配实现 基本数据类型DI装配 Bean配置 注解方式配置 类上添加Ioc注解配置文件中告诉SpringIoc容器要检查哪些包 注解仅是一个标记 注解 不同注解仅是为了方便开…...

WPF中的隧道路由和冒泡路由事件

文章目录 简介&#xff1a;一、事件最基本的用法二、理解路由事件 简介&#xff1a; WPF中使用路由事件升级了传统应用开发中的事件&#xff0c;在WPF中使用路由事件能更好的处理事件相关的逻辑&#xff0c;我们从这篇开始整理事件的用法和什么是直接路由&#xff0c;什么是冒…...

ISO七层模型 tcp/ip

OSI七层模型&#xff08;重点例子&#xff09; OSI&#xff08;Open Systems Interconnection&#xff09;模型&#xff0c;也称为开放系统互连模型&#xff0c;是一个理论模型&#xff0c;由国际标准化组织&#xff08;ISO&#xff09;制定&#xff0c;用于描述和理解不同网络…...