lua学习之基础概念篇
基础概念
程序块 (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_INIT的变量
- 找到了 @文件名
- 没找到
在 lua 运行脚本前的参数
没有记住所有的内容和概念
程序块、交互模式、解释器
记忆的概念没有匹配对应名称,记忆混乱的情况
第三日复习
流程控制保留字
if, elseif, then ,end, break, for, do, return, while, until, repeat
类型保留字
nil, function, local
其他
in, id
逻辑判断
and, or, not
条件判断
true, false
在解释器执行参数前
- 会先寻找一个名为 LUA_INIT 的环境变量
- 找到了并且内容为 @文件名,就会执行这个文件
- 没找到,就执行解释器中输入的内容 【错误】
没找到,就假设这个变量为 lua 代码,并执行
第三步记忆和理解出错
运行脚本前的参数
- 会建立一个名为 arg 的 table 把这些参数全部存进去
- 脚本名 为索引 0, 其后的参数以此类推
- 脚本名前的参数为负数
- 一般不会使用负数索引
- 可变长度参数 ... 【记忆混乱】
需要记忆的点
【全局变量 arg】 检索启动参数
... 表示所有传递给脚本的参数
脚本可通过变长参数语法来检索参数
全局变量的创建概念和声明
lua学习之基础概念篇的更多相关文章
- DNA拷贝数变异CNV检测——基础概念篇
DNA拷贝数变异CNV检测——基础概念篇 一.CNV 简介 拷贝数异常(copy number variations, CNVs)是属于基因组结构变异(structural variation), ...
- (数据科学学习手札102)Python+Dash快速web应用开发——基础概念篇
本文示例代码与数据已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 这是我的新系列教程Python+Dash快 ...
- lua学习之复习汇总篇
第六日笔记 1. 基础概念 程序块 定义 在 lua 中任何一个源代码文件或在交互模式中输入的一行代码 程序块可以是任意大小的 程序块可以是一连串语句或一条命令 也可由函数定义构成,一般将函数定义写在 ...
- Java基础学习之基础概念与环境搭建(1)
1.Java基础概念 1.1.Java语言的特点 Java语言是简单易学的 Java语言是面向对象(封装.继承和多态) Java语言是平台无关的(一次编译,到处运行) Java语言是可靠的.安全的(异 ...
- Lua 学习之基础篇十<Lua 常见的语法规则>
下面讲一些lua 常见的用法和规则,可以为学习理解lua带来帮助,最后附上的部分是lua的基本操作,基本包含所有常用语法语句. 1. if判断 lua把 nil 和false 视为"假&qu ...
- Lua 学习之基础篇七<Lua Module,Package介绍>
Lua 之Module介绍 包管理库提供了从 Lua 中加载模块的基础库. 只有一个导出函数直接放在全局环境中: [require]. 所有其它的部分都导出在表 package 中. require ...
- Lua 学习之基础篇一<Lua 运算符>
引言 由于刚接触lua,个人觉得接触一门新语言,就要一定要对基础的部分做一个快速了解. 于是参考网上相关资料吸收并整理下来作为笔记,模糊的时候用来回顾一下. 这些部分基本都是经过自己手动测试梳理过,没 ...
- Lua 学习之基础篇九<Lua 协同程序(Coroutine)>
引言 讲到协程,首先来介绍一下线程和协程的区别 lua协程和多线程 相同之处:拥有自己独立的桟.局部变量和PC计数器,同时又与其他协程共享全局变量和其他大部分东西 不同之处:一个多线程程序可以同时运行 ...
- Lua 学习之基础篇八<Lua 元表(Metatabble)&&继承>
讲到元表,先看一段table的合并动作. t1 = {1,2} t2 = {3,4} t3 = t1 + t2 attempt to perform arithmetic on a table val ...
随机推荐
- ACWing 248. 窗内的星星|扫描线+懒惰标记
传送门 题目描述 在一个天空中有很多星星(看作平面直角坐标系),已知每颗星星的坐标和亮度(都是整数). 求用宽为W.高为H的矩形窗户(W,H为正整数)能圈住的星星的亮度总和最大是多少.(矩形边界上的星 ...
- 配置IDEA默认作者@author
IDEA安装目录下,使用文本编辑器打开~/bin/idea64.exe.vmoptions文件 在最后添加:-Duser.name=Your name 保存重启IDEA,Done
- 第三篇python用户登录程序实现
需求: 1.通过注册输入用户名和密码 2.能够验证用户名和密码是否正确 3.限制输入一定错误次数后退出程序 4.利用格式化输出方式输出信息 分析: 使用username=input()和passwor ...
- kubernetes concepts -- Pod Lifecycle
Pod Lifecycle This page describes the lifecycle of a Pod. Pod phase A Pod’s status field is a PodSta ...
- scrapy基本的流程 糗事百科
https://www.cnblogs.com/c-x-a/p/9889623.html 创建scrapy工程 1.scrapy startproject xxx xxx就是你的项目名,这里我们给我们 ...
- javascript 内置对象和方法
一.自定义对象 方法1 /* 自定义对象 */ var sex= "gender" var person={"name": "tom", & ...
- Django SQLite3的使用
https://blog.csdn.net/qq_34485436/article/details/72805908
- Jenkins配置邮件发送测试报告
前言 在之前的文章(Jenkins自动执行python脚本输出测试报告)中,我们已成功实现利用Jenkins自动执行python脚本,输出并可直接在界面上查看测试报告,这里我们还差最后一步,我们需要将 ...
- typescript 为什么使用 let呢
为什么是使用let呢 因为已经厌烦了 int var 呵呵
- Educational Codeforces Round 80 (Rated for Div. 2) E. Messenger Simulator
可以推出 min[i]要么是i要么是1,当a序列中存在这个数是1 max[i]的话就比较麻烦了 首先对于i来说,如果还没有被提到第一位的话,他的max可由他后面的这部分序列中 j>=i 的不同数 ...