基础概念

程序块 (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. 微服务统计,分析,图表,监控一体化的HttpReports项目在.Net Core 中的使用

    简单介绍 HttpReports 是 .Net Core 下的一个Web项目, 适用于WebAPI,Ocelot网关应用,MVC项目,非常适合针对微服务应用使用,通过中间件的形式集成到您的项目中,可以 ...

  2. Java散点

    1.在Java中,所有需要保存在常量池中的数据,长度最大不能超过65535,这当然也包括字符串的定义

  3. nginx 负载均衡及反向代理

    Nginx简介 Nginx是一款高性能的http 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器.由俄罗斯的程序设计师开发,官方测试nginx能够支支撑5万并发链接,并且cpu.内存 ...

  4. spring同时操作多数据库 多个mysql和mongoDB,不需切换数据源,同时操作mysql和mongodb

    源码:https://github.com/haihai1172/spring-mysql-mongoDB 项目目录 1.环境搭建,java-sdk 1.8 具体怎么搭建,就不说了 2.配置jdbc. ...

  5. PGSQL 日期时间的比较

    pgsql支持日期时间的比较,但是需要注意的是,我们写sql的时候传入的参数一般是字符串类型,我们需要把把字符串转化为Date类型,否则会查不到内容. 例子: select * from user w ...

  6. win + ubuntu 双系统 grub引导项修复

    ubuntu liveCD模式,找到ubuntu的系统盘位置,挂载到系统上面,然后使用grub进行修复 ubuntu liveCD模式下是用boot-repair软件进行修复 grub急救模式 1. ...

  7. .net Core 使用IHttpClientFactory请求

            导读:本文已添加在晨曦微服务之旅,现在自己在尝试微服务架构,一边学边做项目快速的进入状态.当然在学习的过程中会将自己学到的知识进行分享. 一.为什么不用HttpClient       ...

  8. java 支持分词的高性能拼音转换工具,速度是 pinyin4j 的两倍

    pinyin pinyin 是 java 实现的高性能中文拼音转换工具. 变更日志 创作目的 想为 java 设计一款便捷易用的拼音工具. 如何为 java 设计一款高性能的拼音转换工具 pinyin ...

  9. AD19覆铜与边框间距设置方法

    转载请注明出处,并附带本文网址https://www.cnblogs.com/brianblog/p/9894867.html, 由于高版本AD不能将机械层直接转变为KEPP OUT LAYER层,所 ...

  10. Linux下搭建Jmeter+Ant+Jenkins自动化测试框架

    前言 在之前的文章中,我们学习了通过Ant调用Jmeter脚本生成HTML测试报告,但未实现自动执行脚本生成报告,同时生成的报告是在Linux下,查看报告很不方便.因此,我们将结合Jenkins来进一 ...