lua学习<基础概念>

基础概念

程序块 (chunk)

定义


lua 中的每一个源代码文件或在交互模式(Cmd)中输入的一行代码都称之为程序块一个程序块就是一连串语句或者命令lua 中连续的语句不需要分隔符,但为了可读性可以加换行,或者分隔符分号 ; 来分割语句但是换行在代码中没有任何作用,仅仅是为了提高可读性


<code>a = 1b = a * 2​a = 1;b = a * 2​a = 1; b = a * 2a = 1 b = a * 2/<code>


一个程序块可以仅包含一条语句,也可以由多条不同的语句或函数的定义构成


程序块可以是任意大小的可以将程序块保存在文件中然后再执行也可以将程序块放到交互模式中运行解释器


当使用任何参数直接运行解释器时会看到这样得提示符


<code>Lua 5.1.5 Copyright (C) 1994-2012 Lua.org Puc-Rio>/<code>再这种模式下输入得每条命令都将立即被执行要退出交互模式和解释器可以调用操作系统库的 exit 函数,输入 os.exit()或者 end-of-file 控制字符,在 DOS/Windows 中是

Ctrl + Z在交互模式中解释器通常将所输入的内容当作一个完整的程序块来解释如果解释器检测到某行所输入的内容不足以构成一个完整的程序块,那么它就会等待输入这种机制的存在使得我们可以在交互模式中输入某些函数的多行定义


但将多行内容放入文件中才是更常见的做法


然后在交互模式中通过调用解释器来执行文件

<code>-- fact.lua 阶乘文件function fact(n) if n == 0 then return 1 --0的阶乘是1 else return n * fact(n - 1) --输入3会执行 3 * 2 * 1 endendprint("Enter a number:")a = io.read("*number")print(fact(a))/<code>


-i 参数

通过 -i 参数来启动解释器lua -i prog这样会先运行文件 prog 中的程序块后再进入交互模式


读取用户输入并指定格式

io.read("*number") 读取数字格式


dofile 函数

立即执行一个函数文件运行后如果无报错相当于加载了这个lua 文件中的函数库就可以在后续的交互模式中直接调用这个函数库里定义的方法方便测试新的代码,在代码编辑器中修改后在交互模式中执行dofile即加载修改后新的代码使用 dofile 后里面字符串文件路径的 \\ 记得再用一次 \\ 进行转义如:dofile("d:\\demo\\a.lua")

<code>-- lib1.lua-- 计算两个数的平方和在开平方根function norm(x, y) return (x ^ 2 + y ^ 2) ^ 0.5end-- 计算某数的两倍function twice(n) return n * 2end/<code>


<code>> dofile("lib1.lua") -- 加载你编写的程序库,需要填完整的文件路径> n = norm(3.14, 1.0)> print(twice(4)) -- 8/<code>


词法规范

标识符

可以由任意字母、下划线、数字构成的字符串但不可以由数字开头


避免使用以一个下划线开头之后跟着一个或多个大写字母的标识符

lua 会将这些标识符保留,用作特殊用途如 _VERSION, _PROMPT因为这是 lua 中的哑变量


区域设置(Locale)


在 lua 中什么是字母的概念依赖于区域设置(Locale)如果设置了对应的区域如希腊,就可以使用希腊字母作为变量名了但这样的变量可能无法在不支持该区域的系统上运行


保留字


andbreakdoelseelseifendfalseforfunctionidinlocalnilnotorrepeatreturnthentrueuntilwhile


lua中区分大小写,如 "And" "AND" 是可以作为变量的,且与保留字 and 完全不同


注释的写法

单行注释:--code block多行注释:--[[ code block ]]一旦写了注释后面的代码将不会起作用,解释器会将其忽略小技巧:建议这样写多行注释 --[[ code block --]]可以在块注释前加一个连字符 - 即可启用代码块中的代码


<code>--[[ print(222) print(666) --都不起作用(因为块注释注释掉了其中的代码)--]]​-- 常规写法加一个连字符写块注释---[[ print(222) print(666) --会报错]]​-- 推荐写法加一个连字符写块注释-- 因为这样写的话,第一行和最后一行就变成了两个彼此独立的单行注释---[[ print(222) print(666)--]]/<code>


全局变量

全局变量不需要声明只需要将一个值赋给这个全局变量即可创建在 lua 中访问一个未初始化的变量并不会发生错误但访问的结果是一个特殊的值 nil ,也就是空值删除全局变量,将它赋值为 nil

<code>print(b) -- nilb = 10print(b) -- 10​-- 删除全局变量b = nil print(b) -- nil/<code>


解释器程序

[] 代表可选项lua [选项参数] [脚本[参数]]不使用参数会直接进入交互模式-e 直接在命令行中输入代码如果只有 -e ,没有 -i 那么就不会进入交互模式,而是运行后直接结束-l 用于加载库文件


_PROMPT


修改这个全局变量,就会修改交互模式下的命令提示符外面的双引号用于阻止 shell 误解内层的单引号

<code>lua -i -e "_PROMPT = 'lua>'"Lua 5.1.5 Copyright (C) 1994-2012 Lua.org, PUC-Riolua>/<code>


在交互模式中打印任何表达式的值


print()也可以使用等号开头后面跟一个表达式 =


在解释器执行其参数前


先会寻找一个 LUA_INIT 的环境变量如果找到了,并且它的内容为 @文件名 的话解释器就会先执行这个文件如果 LUA_INIT 没有以 @ 开头,解释器就假设变量内容为 lua 代码,并运行这段 lua 代码LUA_INIT 可以灵活地配置解释器,并且可以完全控制如何配置它比如:可以预先加载一个程序包(Package)、修改命令提示符和路径、定义函数、对函数进行改名或删除等。


运行脚本前的参数

在脚本代码中,可以通过全局变量 arg 来检索脚本的启动参数解释器在运行脚本前,会用所有的命令行参数创建一个名为 arg 的 table脚本名称位于索引 0 上它的第一个参数(示例中的 a) 位于索引1 ,以此类推而在 脚本文件(示例中的>


<code>lua 脚本 a b clua -e "sin = math.sin">

<code>lua 脚本 a b clua -e "sin = math.sin">


通常脚本只会使用正数索引(示例中的 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中的元素销毁,也是变量在未赋值之前的默认值


没有熟练掌握的保留字


breaktruefalseinlocalnilnotreturnwhile