【CS.PL】Lua 编程之道: 控制结构 - 进度24%

3 初级阶段 ------ 控制结构

文章目录

  • [3 初级阶段 ------ 控制结构](#3 初级阶段 —— 控制结构)
    • [3.1 条件语句:if、else、elseif](#3.1 条件语句:if、else、elseif)
    • [3.2 循环语句:for、while、repeat-until](#3.2 循环语句:for、while、repeat-until)
      • [3.2.1 输出所有的命令行参数](#3.2.1 输出所有的命令行参数)
      • [3.2.2 while.lua](#3.2.2 while.lua)
      • [3.2.3 repeat.lua及其作用域 🔥](#3.2.3 repeat.lua及其作用域 🔥)
      • [3.2.4 for.lua (For Statement)](#3.2.4 for.lua (For Statement))
      • [3.2.5 泛型for](#3.2.5 泛型for)
      • [3.2.6 goto](#3.2.6 goto)
    • 往期回顾

3.1 条件语句:if、else、elseif

lua 复制代码
-- (1)
if true then  
    print(1) -- 1  
end  

-- (2)
if false then  
    print(1)  
else  
    print(0) -- 0  
end  

-- (3)
if false then  
    print(1)  
elseif true then  
    print(2) -- 2  
else  
    print(0)  
end

3.2 循环语句:for、while、repeat-until

3.2.1 输出所有的命令行参数

下标从1开始, 但-1, -2也可以, 没有值就是nil

块分界词 do end

语句不用加分号, 也可以加
#arg就是内置的全局变量

lua 复制代码
for i = -2, #arg do  
    print(i, arg[i])  
end

output:

bash 复制代码
# lua args.lua 2 a
-2      nil
-1      lua
0       args.lua
1       2
2       a

3.2.2 while.lua

lua 复制代码
local cnt = 0  
local i = 1  
while i <= 100 do  
    cnt = cnt + i  
    i = i + 1  
end  
print(cnt) -- 5050

3.2.3 repeat.lua及其作用域 🔥

lua 复制代码
local cnt = 0  
local i = 1  
repeat  
    cnt = cnt + i  
    i = i + 1  
until i > 100  
print(cnt) -- 5050

以下是一个计算平方根的例子:

lua 复制代码
local x = 2  
local sqrt = x / 2  
repeat  
    sqrt = (sqrt + x / sqrt) / 2  
    local diff = math.abs(sqrt^2 - x)  
until diff < 0.000001 -- error的作用域包括until后面的语句  
print(sqrt) -- 1.4142135623747

3.2.4 for.lua (For Statement)

for 循环用于迭代数值或集合。

More precisely, a for statement like

复制代码
 for v = _e1_, _e2_, _e3_ do _block_ end

is equivalent to the code 分别为起始, 终止, 步长, e₁, e₂, e₃只执行一次

lua 复制代码
local cnt = 0  
for i = 100, 1, -1 do -- 100开始, 到1, 每次-1  
    cnt = cnt + i  
end  
print("cnt=", cnt) -- 5050

-- 死循环示例
--[[  
local cnt = 0  
for i = 1, match.huge do -- 死循环  
    cnt = cnt + i
    if cnt > 1000 then
        break
    end
end  
print("cnt=", cnt) -- 5050  
]]  
function f(x)  
    return 5*x  
end  
local num = 1  
for i = 1, f(num) do -- 这个值一旦给定, f(num)只会调用执行一次  
    print("Hello!")  -- 打印f(1) = 5次
    num = 2  
end

3.2.5 泛型for

for ... in ... do 用于迭代器,例如遍历表。

\[1000.03.CS.PL-Lua#4.1.5 表的实现 ------ 迭代器\]

lua 复制代码
for k, v in pairs(_G) do  -- 全局变量打印
    print(k, v)  
end
--[[output:
...
]]

for k, v in pairs(_G.os) do  
    print(k, v)  -- 
end
--[[output:
exit    function: 0x564a436fccd0
setlocale       function: 0x564a436fd630
date    function: 0x564a436fcbb0
getenv  function: 0x564a436fd540
difftime        function: 0x564a436fcc10
remove  function: 0x564a436fd5a0
time    function: 0x564a436fd690
clock   function: 0x564a436fcb50
tmpname function: 0x564a436fd6f0
rename  function: 0x564a436fd5d0
execute function: 0x564a436fcc70
]]

以下是遍历数组、字典和字符串字符的例子:

lua 复制代码
-- 遍历数组: ipairs后面是一个序列, 不可以是有空洞的数组
local arr = {10, 20, 30, 40, 50}  
for index, value in ipairs(arr) do  
    print("Index:", index, "Value:", value)  
end  
-- 遍历字典(表)  
local dictionary = {name = "Alice", age = 25, city = "Wonderland"}  
for key, value in pairs(dictionary) do  
    print("Key:", key, "Value:", value)  
end  
-- 遍历字符串字符  
local str = "Lua Programming"  
for index, char in ipairs({str:byte(1, #str)}) do  
    print("Index:", index, "Character:", string.char(char))  
end

3.2.6 goto

在 Lua 5.2 及以后的版本中,可以使用 goto 标签来实现在循环中跳过当前迭代并进行下一次迭代,从而达到类似于 continue 的效果。

lua 复制代码
for i = 1, 10 do
    if i == 5 then
        goto continue
    end
    print("Iteration:", i)
    
    ::continue::
end

这些控制结构为 Lua 提供了强大的流程控制能力,使其能够处理各种复杂的编程任务。

往期回顾

相关推荐
小许好楠2 分钟前
java开发工程师-学习方式
java·开发语言·学习
superman超哥19 分钟前
仓颉锁竞争优化深度解析
c语言·开发语言·c++·python·仓颉
Halo_tjn19 分钟前
基于 IO 流实现文件操作的专项实验
java·开发语言
一晌小贪欢20 分钟前
【Python办公自动化】Python办公自动化常用库新手指南
开发语言·python·python自动化办公·python3·python办公自动化·python办公
业精于勤的牙28 分钟前
最长特殊序列(二)
java·开发语言·算法
yong999039 分钟前
C#实现OPC客户端与S7-1200 PLC的通信
开发语言·网络·算法·c#
charlie1145141911 小时前
快速在WSL上开发一般的C++上位机程序
开发语言·c++·笔记·学习·环境配置·工程
仲夏月二十八1 小时前
关于golang中何时使用值对象和指针对象的描述
开发语言·后端·golang
我命由我123451 小时前
CSS 锚点定位 - 锚点定位引入(anchor-name、position-anchor)
开发语言·前端·javascript·css·学习·html·学习方法
哟哟耶耶1 小时前
js-清除首尾空白字符再进行空白匹配str.trim().match(...)
开发语言·前端·javascript