【CS.PL】Lua 编程之道: 基础语法和数据类型 - 进度16%

2 初级阶段 ------ 基础语法和数据类型

文章目录

  • [2 初级阶段 ------ 基础语法和数据类型](#2 初级阶段 —— 基础语法和数据类型)
    • [2.0 关键字(keywords) 🔥](#2.0 关键字(keywords) 🔥)
    • [2.1 注释与标识符](#2.1 注释与标识符)
      • [2.1.1 注释](#2.1.1 注释)
      • [2.1.2 标识符](#2.1.2 标识符)
    • [2.2 变量与赋值](#2.2 变量与赋值)
      • [2.2.1 所有变量默认是全局变量 ≠ local, 有一个例外](#2.2.1 所有变量默认是全局变量 ≠ local, 有一个例外)
      • [2.2.2 local变量是局部变量, 以end作为边界](#2.2.2 local变量是局部变量, 以end作为边界)
      • [2.2.3 多个变量同时赋值且变量没有类型, 只是一个引用](#2.2.3 多个变量同时赋值且变量没有类型, 只是一个引用)
      • [2.2.4 用全局变量给局部变量赋值](#2.2.4 用全局变量给局部变量赋值)
    • [2.3 数据类型:数字、字符串、布尔值](#2.3 数据类型:数字、字符串、布尔值)
      • [2.3.1 数值类型](#2.3.1 数值类型)
      • [2.3.2 字符串 ------ `#`获取长度/`..`连接符 🔥](#获取长度/..`连接符 🔥)
      • [2.3.3 只有nil和boolean的false会使条件表达式为假, 0或""都会判为真](#2.3.3 只有nil和boolean的false会使条件表达式为假, 0或""都会判为真)
    • [2.4 运算符和表达式](#2.4 运算符和表达式)
      • [2.4.0 算数运算符](#2.4.0 算数运算符)
      • [2.4.1 逻辑运算符`and`/`or`/`not`](#2.4.1 逻辑运算符and/or/not)
      • [2.4.2 比较运算符 `==` / `~=` / `>` / `<` / `>=` / `<=`](#2.4.2 比较运算符 == / ~= / > / < / >= / <=)
      • [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 支持两种注释形式:

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

--[[
这是
多行
注释
--]]

2.1.2 标识符

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

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

2.2 变量与赋值

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

lua 复制代码
print(daokeke) -- nil
do  
    daokeke= "myself" -- 所有变量默认是全局变量  
end  
print(daokeke) -- myself

except:

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

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

lua 复制代码
print(daokeke) -- nil
do  
    local daokeke= "myself" -- local变量是局部变量
end  
print(daokeke) -- nil

2.2.3 多个变量同时赋值且变量没有类型, 只是一个引用

lua 复制代码
local x, y = 10, 20
x, y = y, x -- 先取值, 再赋值, 效率不高, 但是写法简单, 不需手动引入第三个变量
print(x, y) -- 20      10

x = "a"  
y = "b"  
print(x, y) -- a   b

a = 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 用全局变量给局部变量赋值

lua 复制代码
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); 可以完全当成计算器来用

lua 复制代码
print(type(123)) -- number
print(type(3.14)) -- number
print(type(2.99e10)) -- number

print(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字符串的实现及其编码实践]]

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或""都会判为真

lua 复制代码
-- 只有`nil`和boolean type中的`false`会使条件表达式为假, 0或""都会判为真  
print(type(nil)) -- nil 
print(type(true)) -- boolean

2.4 运算符和表达式

2.4.0 算数运算符

Lua 支持常见的算术运算符,如 +-*/ 等。

  • +:加法
  • -:减法
  • *:乘法
  • /:除法
  • %:取模(求余数)
  • ^:幂运算
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

lua 复制代码
-- 语法糖: 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) -- 123

print(false or nil) -- nil  
print(not nil) -- true  
print(not 0) -- false

2.4.2 比较运算符 == / ~= / > / < / >= / <=

比较:

lua 复制代码
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 特殊的表达式

初始化:

lua 复制代码
-- x = x1 or {xx} x1存在, x为x1;否则为{}
a = a1 or 0
print(a)  -- 0

三目运算符A?B:C:

lua 复制代码
-- 已知B为真, A真 -> A and B -> B, B or C -> B; A假 -> A and B -> A, B or C -> C

a = 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%

相关推荐
明月看潮生几秒前
青少年编程与数学 02-004 Go语言Web编程 20课题、单元测试
开发语言·青少年编程·单元测试·编程与数学·goweb
大G哥10 分钟前
java提高正则处理效率
java·开发语言
VBA633720 分钟前
VBA技术资料MF243:利用第三方软件复制PDF数据到EXCEL
开发语言
轩辰~22 分钟前
网络协议入门
linux·服务器·开发语言·网络·arm开发·c++·网络协议
小_太_阳31 分钟前
Scala_【1】概述
开发语言·后端·scala·intellij-idea
向宇it32 分钟前
【从零开始入门unity游戏开发之——unity篇02】unity6基础入门——软件下载安装、Unity Hub配置、安装unity编辑器、许可证管理
开发语言·unity·c#·编辑器·游戏引擎
古希腊掌管学习的神1 小时前
[LeetCode-Python版]相向双指针——611. 有效三角形的个数
开发语言·python·leetcode
赵钰老师1 小时前
【R语言遥感技术】“R+遥感”的水环境综合评价方法
开发语言·数据分析·r语言
就爱学编程1 小时前
重生之我在异世界学编程之C语言小项目:通讯录
c语言·开发语言·数据结构·算法
Oneforlove_twoforjob2 小时前
【Java基础面试题025】什么是Java的Integer缓存池?
java·开发语言·缓存