当前位置: 首页 > 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++对比:

  1. do end <==> { }
  2. 除非声明为local, 否则不以do end区分生命周期, 默认都是全局变量,
  3. 只有nil和boolean类型的false会使条件表达式为假, 0或""都会判为真
  4. 语法糖: lhs and rhs ==> 如果lhs为真, 返回rhs; 如果lhs为假, 返回lhs, 同理, or 和 not

2.1 注释与标识符

2.1.1 注释

在 Lua 中,注释用于对代码进行解释说明,而不会被实际执行。Lua 支持两种注释形式:

  • 单行注释:使用两个连字符 -- 开头,后面跟着注释内容。
  • 多行注释:使用两个连续的方括号 --[[ 开头,以及两个连续的方括号 --]] 结尾,之间是注释内容。
-- 这是单行注释--[[
这是
多行
注释
--]]

2.1.2 标识符

在 Lua 中,标识符用于命名变量、函数和其他数据。标识符的命名规则如下:

  • 以字母(大小写均可)或下划线 _ 开头,后面可以跟字母、数字和下划线。
  • Lua 是区分大小写的,因此 myVarmyvar 是不同的标识符。

2.2 变量与赋值

2.2.1 所有变量默认是全局变量 ≠ local, 有一个例外

print(peichen) -- nil
do  peichen = "myself" -- 所有变量默认是全局变量  
end  
print(peichen) -- myself

except:

for i = 1, 5 do -- 这个i为局部变量  print(i)  
end  
print(i) -- nil

2.2.2 local变量是局部变量, 以end作为边界

print(peichen) -- nil
do  local peichen = "myself" -- local变量是局部变量
end  
print(peichen) -- 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(peichen) -- nil
peichen = "good!"  
do  local peichen = peichen -- 用全局变量给局部变量赋值 peichen = "boy!"  print(peichen) -- boy!
end  
print(peichen) -- 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 支持常见的算术运算符,如 +-*/ 等。

  • +:加法
  • -:减法
  • *:乘法
  • /:除法
  • %:取模(求余数)
  • ^:幂运算

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 比较运算符 ~=/>=/…

2.4.2 特殊的表达式

初始化:

-- x = x1 or {xx} x1存在, x为x1;否则为{}
a = a1 or 0

三目运算符A?B:C:

-- 已知B为真, A真 -> A and B -> B, B or C -> B; A假 -> A and B -> A, B or C -> C

往期回顾

【CS.PL】Lua 编程之道: 简介与环境设置 - 进度8%

相关文章:

  • HBase数据库面试知识点:第一部分 - 基础概念与特点(持续更新中)
  • 电商API接口的采集实例:京东商品详情API接口的采集过程和步骤分析
  • 二叉树的算法题目
  • SolidWorks官方授权代理商亿达四方带您解读最新SW版本特性
  • Java Opencv识别图片上的虫子
  • [汇总] CentOS中查询端口终止进程的指令
  • 启动mysql 3.5时出现 MySql 服务正在启动 . MySql 服务无法启动。
  • tim定时器 输入捕获模式下 TIM–ICStructinit(TIM–ICStructinit) 这个值 解析
  • C++中的结构体——结构体嵌套结构体
  • 全球5G时代,智启未来生活
  • HandyControl的属性编辑器如何绑定自定义控件,并集成到自定义编辑器
  • 接口自动化测试框架-fixture函数使用
  • 【FreeRTOS】软件定时器 software timer(上)
  • 教你一招,告警恢复时如何拿到恢复时的值?
  • 代理模式与静态代理、动态代理的实现(Proxy.newProxyInstance、InvocationHandler)
  • [ 一起学React系列 -- 8 ] React中的文件上传
  • Apache的80端口被占用以及访问时报错403
  • axios请求、和返回数据拦截,统一请求报错提示_012
  • Computed property XXX was assigned to but it has no setter
  • ES6, React, Redux, Webpack写的一个爬 GitHub 的网页
  • JavaScript中的对象个人分享
  • linux学习笔记
  • MD5加密原理解析及OC版原理实现
  • Perseus-BERT——业内性能极致优化的BERT训练方案
  • ubuntu 下nginx安装 并支持https协议
  • UMLCHINA 首席专家潘加宇鼎力推荐
  • Vue--数据传输
  • windows下如何用phpstorm同步测试服务器
  • 创建一种深思熟虑的文化
  • 服务器之间,相同帐号,实现免密钥登录
  • 关于Android中设置闹钟的相对比较完善的解决方案
  • 计算机常识 - 收藏集 - 掘金
  • 使用iElevator.js模拟segmentfault的文章标题导航
  • 使用Swoole加速Laravel(正式环境中)
  • 微信小程序实战练习(仿五洲到家微信版)
  • 文本多行溢出显示...之最后一行不到行尾的解决
  • # 利刃出鞘_Tomcat 核心原理解析(二)
  • #DBA杂记1
  • #if 1...#endif
  • (2)从源码角度聊聊Jetpack Navigator的工作流程
  • (21)起落架/可伸缩相机支架
  • (23)Linux的软硬连接
  • (6)【Python/机器学习/深度学习】Machine-Learning模型与算法应用—使用Adaboost建模及工作环境下的数据分析整理
  • (二) Windows 下 Sublime Text 3 安装离线插件 Anaconda
  • (考研湖科大教书匠计算机网络)第一章概述-第五节1:计算机网络体系结构之分层思想和举例
  • (转载)OpenStack Hacker养成指南
  • *(长期更新)软考网络工程师学习笔记——Section 22 无线局域网
  • .NET CORE 2.0发布后没有 VIEWS视图页面文件
  • .NET Core 版本不支持的问题
  • .NET Core 中插件式开发实现
  • .Net Core中Quartz的使用方法
  • .Net MVC + EF搭建学生管理系统
  • .NET 命令行参数包含应用程序路径吗?
  • .net6Api后台+uniapp导出Excel
  • .net6解除文件上传限制。Multipart body length limit 16384 exceeded