基础概念

程序块 (chunk)

定义

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

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

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

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

Lua 5.1.5 Copyright (C) 1994-2012 Lua.org Puc-Rio
>
  1. 在这种模式下输入得每条命令都将立即被执行
  2. 要退出交互模式和解释器
    1. 可以调用操作系统库的 exit 函数,输入 os.exit()
    2. 或者 end-of-file 控制字符,在 DOS/Windows 中是 Ctrl + Z
  3. 在交互模式中解释器通常将所输入的内容当作一个完整的程序块来解释
  4. 如果解释器检测到某行所输入的内容不足以构成一个完整的程序块,那么它就会等待输入
  5. 这种机制的存在使得我们可以在交互模式中输入某些函数的多行定义

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

  1. 在交互模式中通过调用解释器来执行文件
-- 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 参数

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

读取用户输入并指定格式

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

dofile 函数

  1. 立即执行一个函数文件
  2. 运行后如果无报错
  3. 相当于加载了这个lua 文件中的函数库
  4. 就可以在后续的交互模式中直接调用这个函数库里定义的方法
  5. 方便测试新的代码,在代码编辑器中修改后在交互模式中执行dofile即加载修改后新的代码
  6. 使用 dofile 后里面字符串文件路径的 \ 记得再用一次 \ 进行转义
  7. 如: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

词法规范

标识符

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

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

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

区域设置(Locale)

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

保留字

  1. and
  2. break
  3. do
  4. else
  5. elseif
  6. end
  7. false
  8. for
  9. function
  10. id
  11. in
  12. local
  13. nil
  14. not
  15. or
  16. repeat
  17. return
  18. then
  19. true
  20. until
  21. while

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

注释的写法

  1. 单行注释:--code block
  2. 多行注释:--[[ code block ]]
  3. 一旦写了注释后面的代码将不会起作用,解释器会将其忽略
  4. 小技巧:建议这样写多行注释 --[[ code block --]]
  5. 可以在块注释前加一个连字符 - 即可启用代码块中的代码
--[[
print(222)
print(666) --都不起作用(因为块注释注释掉了其中的代码)
--]] -- 常规写法加一个连字符写块注释
---[[
print(222)
print(666) --会报错
]] -- 推荐写法加一个连字符写块注释
-- 因为这样写的话,第一行和最后一行就变成了两个彼此独立的单行注释
---[[
print(222)
print(666)
--]] -- 在注释块中包含注释,在不加 = 的时候会报错
-- 可以在注释 --[任意个=[]]与之前匹配的任意等号] --[==[
--[[
print("在多行注释中输入多行注释")
--]]
-- print("在多行注释中输入单行注释")
--]==]

全局变量

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

解释器程序

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

_PROMPT

  1. 修改这个全局变量,就会修改交互模式下的命令提示符
  2. 外面的双引号用于阻止 shell 误解内层的单引号
lua -i -e "_PROMPT = 'lua>'"
Lua 5.1.5 Copyright (C) 1994-2012 Lua.org, PUC-Rio
lua>

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

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

在解释器执行其参数前

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

运行脚本前的参数

  1. 在脚本代码中,可以通过全局变量 arg 来检索脚本的启动参数
  2. 解释器在运行脚本前,会用所有的命令行参数创建一个名为 arg 的 table
  3. 脚本名称位于索引 0 上
  4. 它的第一个参数(示例中的 a) 位于索引1 ,以此类推
  5. 而在 脚本文件(示例中的 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"
  1. 通常脚本只会使用正数索引(示例中的 arg[1] 和 arg[2])
  2. 在 lua 5.1 中,一个脚本还可以通过 “变长参数语法” 来检索其参数
  3. 在脚本主体中,表达式 "..." 3个点表示所有传递给脚本的参数

心得体会

第一日复习

  1. local 局部变量使用
  2. return 用于返回
  3. if, elseif, then, end, 用于条件判断程序结构
  4. for, while, then, end 用于循环程序结果
  5. and, not, or 用于逻辑判断
  6. function 用于定义函数
  7. true false 用于条件值的判断
  8. nil 用于将全局变量、table中的元素销毁,也是变量在未赋值之前的默认值

没有熟练掌握的保留字

  1. break
  2. true
  3. false
  4. in
  5. local
  6. nil
  7. not
  8. return
  9. while

第二日复习

流程控制保留字

  1. if
  2. then
  3. end
  4. elseif
  5. for
  6. do
  7. while
  8. until
  9. repeat
  10. break

条件判断保留字

  1. true
  2. false

逻辑判断保留字

  1. and
  2. or
  3. not

其他保留字

  1. in
  2. return 返回
  3. function 函数

没记住的保留字

  1. id
  2. nil 表示为空,用于清除变量、table元素
  3. local 局部变量

在 解释器执行参数前

概念错误,且没有记住后续步骤

  1. LUA_INIT的变量
  2. 找到了 @文件名
  3. 没找到

在 lua 运行脚本前的参数

没有记住所有的内容和概念

程序块、交互模式、解释器

记忆的概念没有匹配对应名称,记忆混乱的情况

第三日复习

流程控制保留字

if, elseif, then ,end, break, for, do, return, while, until, repeat

类型保留字

nil, function, local

其他

in, id

逻辑判断

and, or, not

条件判断

true, false

在解释器执行参数前

  1. 会先寻找一个名为 LUA_INIT 的环境变量
  2. 找到了并且内容为 @文件名,就会执行这个文件
  3. 没找到,就执行解释器中输入的内容 【错误】

    没找到,就假设这个变量为 lua 代码,并执行

第三步记忆和理解出错

运行脚本前的参数

  1. 会建立一个名为 arg 的 table 把这些参数全部存进去
  2. 脚本名 为索引 0, 其后的参数以此类推
  3. 脚本名前的参数为负数
  4. 一般不会使用负数索引
  5. 可变长度参数 ... 【记忆混乱】

需要记忆的点

  1. 【全局变量 arg】 检索启动参数

  2. ... 表示所有传递给脚本的参数

  3. 脚本可通过变长参数语法来检索参数

  4. 全局变量的创建概念和声明

lua学习之基础概念篇的更多相关文章

  1. DNA拷贝数变异CNV检测——基础概念篇

    DNA拷贝数变异CNV检测——基础概念篇   一.CNV 简介 拷贝数异常(copy number variations, CNVs)是属于基因组结构变异(structural variation), ...

  2. (数据科学学习手札102)Python+Dash快速web应用开发——基础概念篇

    本文示例代码与数据已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 这是我的新系列教程Python+Dash快 ...

  3. lua学习之复习汇总篇

    第六日笔记 1. 基础概念 程序块 定义 在 lua 中任何一个源代码文件或在交互模式中输入的一行代码 程序块可以是任意大小的 程序块可以是一连串语句或一条命令 也可由函数定义构成,一般将函数定义写在 ...

  4. Java基础学习之基础概念与环境搭建(1)

    1.Java基础概念 1.1.Java语言的特点 Java语言是简单易学的 Java语言是面向对象(封装.继承和多态) Java语言是平台无关的(一次编译,到处运行) Java语言是可靠的.安全的(异 ...

  5. Lua 学习之基础篇十<Lua 常见的语法规则>

    下面讲一些lua 常见的用法和规则,可以为学习理解lua带来帮助,最后附上的部分是lua的基本操作,基本包含所有常用语法语句. 1. if判断 lua把 nil 和false 视为"假&qu ...

  6. Lua 学习之基础篇七<Lua Module,Package介绍>

    Lua 之Module介绍 包管理库提供了从 Lua 中加载模块的基础库. 只有一个导出函数直接放在全局环境中: [require]. 所有其它的部分都导出在表 package 中. require ...

  7. Lua 学习之基础篇一<Lua 运算符>

    引言 由于刚接触lua,个人觉得接触一门新语言,就要一定要对基础的部分做一个快速了解. 于是参考网上相关资料吸收并整理下来作为笔记,模糊的时候用来回顾一下. 这些部分基本都是经过自己手动测试梳理过,没 ...

  8. Lua 学习之基础篇九<Lua 协同程序(Coroutine)>

    引言 讲到协程,首先来介绍一下线程和协程的区别 lua协程和多线程 相同之处:拥有自己独立的桟.局部变量和PC计数器,同时又与其他协程共享全局变量和其他大部分东西 不同之处:一个多线程程序可以同时运行 ...

  9. Lua 学习之基础篇八<Lua 元表(Metatabble)&&继承>

    讲到元表,先看一段table的合并动作. t1 = {1,2} t2 = {3,4} t3 = t1 + t2 attempt to perform arithmetic on a table val ...

随机推荐

  1. Spring-Boot使用嵌入式容器,那怎么配置自定义Filter呢

    Listener.Filter和Servlet是Java Web开发过程中常用的三个组件,其中Filter组件的使用频率最高,经常被用来做简单的权限处理.请求头过滤和防止XSS攻击等.如果我们使用的是 ...

  2. Theia APIs——通过JSON-RPC进行通信

    上一篇:Theia APIs——事件 通过JSON-PRC进行通信 在本节中,我将讲解如何创建后端服务并通过JSON-PRC来连接它. 我将使用debug logging system作为例子来进行讲 ...

  3. C#调用7z实现文件的压缩与解压

    1.关于7z 首先在这里先介绍一下7z压缩软件,7z是一种主流的 压缩格式,它拥有极高的压缩比.在计算机科学中,7z是一种可以使用多种压缩算法进行数据压缩的档案格式.主要有以下特点: 来源且模块化的组 ...

  4. wireshark使用过程中,卡死未响应

    原因 : 未知 处理办法:1.重装wireshark ----------无效果 2.卸载有道词典-----------成功,wireshark正常运行,重装有道词典该问题必现,所以问题由有道词典引起 ...

  5. js对象转换为json格式时,js对象属性中有值为null和undefined注意事项

    当属性值为null时: 当属性值为undefined时: 只有当属性值为未定义时, js对象转换成json格式时会忽略该属性.

  6. HTTP图解笔记(六)—— 第6章 HTTP首部

    前言 为啥第一章直接跳到第六章呢,因为...博主当初看书的时候挑着看..只看了第一章和第六章┗( ▔, ▔ )┛ HTTP图解对于不熟悉HTTP的小伙伴来说是很好的书籍,建议入手! 一. HTTP报文 ...

  7. jenkins 配置ssh密钥登录

    1.找到一台服务器执行 ssh-keygen -t rsa 会在目录/root/.ssh生成id_rsa私钥.id_rsa.pub公钥,将公钥的内容写入到同目录下的authorized_keys文件( ...

  8. 关于Matplotlib中No module named 'matplotlib.finance'的解决办法

    最近在研究量化分析,需要用到matplotlib中的一个库,输入from matplotlib.finance import quotes_historical_yahoo_ohlc, candles ...

  9. 我终于学会了使用python操作postgresql

    一 前言 这篇文章不仅适合pgsql,更适合mysql,思路都是一致的,如果读者学会使用psycopg2操作pgsql,那么使用PyMySQL 操作mysql也是很简单:本篇文章涵盖内容广泛,提供的操 ...

  10. 三分钟网络基础-ARP协议

    什么是 ARP 协议 地址解析协议 ARP (Address Resolution Protocal):在同一局域网下,根据已知道的主机或路由器的 IP 地址,找出其相应的硬件地址. 高速缓存 每一个 ...