lua学习之基础概念篇
程序员文章站
2024-02-04 13:36:22
...
基础概念
程序块 (chunk)
定义
- lua 中的每一个源代码文件或在交互模式(Cmd)中输入的一行代码都称之为程序块
- 一个程序块就是一连串语句或者命令
- lua 中连续的语句不需要分隔符,但为了可读性可以加换行,或者分隔符分号 ; 来分割语句
- 但是换行在代码中没有任何作用,仅仅是为了提高可读性
a = 1
b = a * 2
a = 1;
b = a * 2
a = 1; b = a * 2
a = 1 b = a * 2
一个程序块可以仅包含一条语句,也可以由多条不同的语句或函数的定义构成
- 程序块可以是任意大小的
- 可以将程序块保存在文件中然后再执行
- 也可以将程序块放到交互模式中运行解释器
当不使用任何参数直接运行解释器时会看到这样得提示符
Lua 5.1.5 Copyright (C) 1994-2012 Lua.org Puc-Rio
>
- 在这种模式下输入得每条命令都将立即被执行
- 要退出交互模式和解释器
- 可以调用操作系统库的 exit 函数,输入 os.exit()
- 或者 end-of-file 控制字符,在 DOS/Windows 中是 Ctrl + Z
- 在交互模式中解释器通常将所输入的内容当作一个完整的程序块来解释
- 如果解释器检测到某行所输入的内容不足以构成一个完整的程序块,那么它就会等待输入
- 这种机制的存在使得我们可以在交互模式中输入某些函数的多行定义
但将多行内容放入文件中才是更常见的做法
- 在交互模式中通过调用解释器来执行文件
-- fact.lua 阶乘文件
function fact(n)
if n == 0 then
return 1 --0的阶乘是1
else
return n * fact(n - 1) --输入3会执行 3 * 2 * 1
end
end
print("Enter a number:")
a = io.read("*number")
print(fact(a))
-i 参数
- 通过 -i 参数来启动解释器
- lua -i prog
- 这样会先运行文件 prog 中的程序块后再进入交互模式
读取用户输入并指定格式
- io.read("*number") 读取数字格式
dofile 函数
- 立即执行一个函数文件
- 运行后如果无报错
- 相当于加载了这个lua 文件中的函数库
- 就可以在后续的交互模式中直接调用这个函数库里定义的方法
- 方便测试新的代码,在代码编辑器中修改后在交互模式中执行dofile即加载修改后新的代码
- 使用 dofile 后里面字符串文件路径的 \ 记得再用一次 \ 进行转义
- 如:dofile(“d:\\demo\\a.lua”)
-- lib1.lua
-- 计算两个数的平方和在开平方根
function norm(x, y)
return (x ^ 2 + y ^ 2) ^ 0.5
end
-- 计算某数的两倍
function twice(n)
return n * 2
end
> dofile("lib1.lua") -- 加载你编写的程序库,需要填完整的文件路径
> n = norm(3.14, 1.0) -- 3.2953907203851
> print(twice(4)) -- 8
词法规范
标识符
- 可以由任意字母、下划线、数字构成的字符串
- 但不可以由数字开头
避免使用以一个下划线开头之后跟着一个或多个大写字母的标识符
- lua 会将这些标识符保留,用作特殊用途
- 如 _VERSION, _PROMPT
- 因为这是 lua 中的哑变量
区域设置(Locale)
- 在 lua 中什么是字母的概念依赖于区域设置(Locale)
- 如果设置了对应的区域如希腊,就可以使用希腊字母作为变量名了
- 但这样的变量可能无法在不支持该区域的系统上运行
保留字
- and
- break
- do
- else
- elseif
- end
- false
- for
- function
- id
- in
- local
- nil
- not
- or
- repeat
- return
- then
- true
- until
- while
lua中区分大小写,如 “And” “AND” 是可以作为变量的,且与保留字 and 完全不同
注释的写法
- 单行注释:–code block
- 多行注释:–[[ code block ]]
- 一旦写了注释后面的代码将不会起作用,解释器会将其忽略
- 小技巧:建议这样写多行注释 --[[ code block --]]
- 可以在块注释前加一个连字符 - 即可启用代码块中的代码
--[[
print(222)
print(666) --都不起作用(因为块注释注释掉了其中的代码)
--]]
-- 常规写法加一个连字符写块注释
---[[
print(222)
print(666) --会报错
]]
-- 推荐写法加一个连字符写块注释
-- 因为这样写的话,第一行和最后一行就变成了两个彼此独立的单行注释
---[[
print(222)
print(666)
--]]
-- 在注释块中包含注释,在不加 = 的时候会报错
-- 可以在注释 --[任意个=[]]与之前匹配的任意等号]
--[==[
--[[
print("在多行注释中输入多行注释")
--]]
-- print("在多行注释中输入单行注释")
--]==]
全局变量
- 全局变量不需要声明
- 只需要将一个值赋给这个全局变量即可创建
- 在 lua 中访问一个未初始化的变量并不会发生错误
- 但访问的结果是一个特殊的值 nil ,也就是空值
- 删除全局变量,将它赋值为 nil
print(b) -- nil
b = 10
print(b) -- 10
-- 删除全局变量
b = nil
print(b) -- nil
解释器程序
- [] 代表可选项
- lua [选项参数] [脚本[参数]]
- 不使用参数会直接进入交互模式
- -e 直接在命令行中输入代码
- 如果只有 -e ,没有 -i 那么就不会进入交互模式,而是运行后直接结束
- -l 用于加载库文件
_PROMPT
- 修改这个全局变量,就会修改交互模式下的命令提示符
- 外面的双引号用于阻止 shell 误解内层的单引号
lua -i -e "_PROMPT = 'lua>'"
Lua 5.1.5 Copyright (C) 1994-2012 Lua.org, PUC-Rio
lua>
在交互模式中打印任何表达式的值
- print()
- 也可以使用等号开头后面跟一个表达式 =
在解释器执行其参数前
- 先会寻找一个 LUA_INIT 的环境变量
- 如果找到了,并且它的内容为 @文件名 的话
- 解释器就会先执行这个文件
- 如果 LUA_INIT 没有以 @ 开头,解释器就假设变量内容为 lua 代码,并运行这段 lua 代码
- LUA_INIT 可以灵活地配置解释器,并且可以完全控制如何配置它
- 比如:可以预先加载一个程序包(Package)、修改命令提示符和路径、定义函数、对函数进行改名或删除等。
运行脚本前的参数
- 在脚本代码中,可以通过全局变量 arg 来检索脚本的启动参数
- 解释器在运行脚本前,会用所有的命令行参数创建一个名为 arg 的 table
- 脚本名称位于索引 0 上
- 它的第一个参数(示例中的 a) 位于索引1 ,以此类推
- 而在 脚本文件(示例中的 script ) 之前的的所有选项参数位于负数索引上
lua 脚本 a b c
lua -e "sin = math.sin" script a b
-- 解释器将所有参数组织排列为:
arg[-3] = "lua"
arg[-2] = "-e"
arg[-1] = "sin = math.sin"
arg[0] = "script"
arg[1] = "a"
arg[2] = "b"
- 通常脚本只会使用正数索引(示例中的 arg[1] 和 arg[2])
- 在 lua 5.1 中,一个脚本还可以通过 “变长参数语法” 来检索其参数
- 在脚本主体中,表达式 “…” 3个点表示所有传递给脚本的参数
心得体会
第一日复习
- local 局部变量使用
- return 用于返回
- if, elseif, then, end, 用于条件判断程序结构
- for, while, then, end 用于循环程序结果
- and, not, or 用于逻辑判断
- function 用于定义函数
- true false 用于条件值的判断
- nil 用于将全局变量、table中的元素销毁,也是变量在未赋值之前的默认值
没有熟练掌握的保留字
- break
- true
- false
- in
- local
- nil
- not
- return
- while
第二日复习
保留字
流程控制
- if
- then
- end
- elseif
- for
- do
- while
- until
- repeat
- break
条件判断
- true
- false
逻辑判断
- and
- or
- not
其他
- in
- return 返回
- function 函数
没有记住的
- id
- nil 表示为空,用于清除变量、table元素
- local 局部变量
在 lua 执行解释前
概念错误,且没有记住后续步骤
- LUA_INIT的变量
- 找到了 @文件名
- 没找到
在 lua 运行脚本前端参数
没有记住所有的内容和概念
程序块、交互模式、解释器
记忆的概念没有匹配对应名称,记忆混乱的情况