基础概念

程序块 (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. DjangoCBV源码分析

    目录 FBV CBV CBV基本写法 CBV源码分析 settings源码分析 FBV FBV是基于函数的视图 CBV CBV是基于类的视图 CBV基本写法 ​ 朝login提交get请求会自动执行M ...

  2. 20.用PyInstaller打包py程序的步骤及问题解决

    最近写了一个移动和复制文件的代码,代码完成之后,想将其打包成一个可以在任何电脑上使用的软件, 于是在网上查找相关资料,可以用PyInstaller打包成.exe程序,以下是具体步骤: 1.安装PyIn ...

  3. 用 Serverless 快速搭建个人相册网站

    日常生活中我们经常会拍摄一些视频.照片等,这些文件会占用比较多的存储空间.本文将介绍一种方法:利用 ThumbsUp 工具,结合 Serverless Framework 的 component 快速 ...

  4. Redis 千万不要乱用KEYS命令,不然会挨打的

    Redis现如今使用的场景越来越多?如何批量删除key呢? 有人说用KEYS命令,刚开始学Redis的时候就是用这个命令列出库中键. KEYS命令要谨慎使用. 为何?客观别急,我们先一步步来看. KE ...

  5. 【转】Hive Data Manipulation Language

    Hive Data Manipulation Language Hive Data Manipulation Language Loading files into tables Syntax Syn ...

  6. Alodi:环境创建从未如此简单

    一个满足你各种想象的快速方便生成临时环境的系统 在『Alodi:为了保密我开发了一个系统』文章中有讲到我们开发了一个系统用来快速生成临时测试环境,短短三个月已有数百个环境被创建,简化了工作,节省了时间 ...

  7. 在IIS上发布netcore项目

    保证电脑上有.net core sdk或者.net core runtime; 需要安装AspNetCoreModule托管模块:DotNetCore.2.0.5-WindowsHosting.exe ...

  8. Some collections were archived because you’ve reached the shared requests limits.错误解决

    今天打开我的postman 发现我的一个collection不见了,左下角出现一个提示, Some collections were archived because you’ve reached t ...

  9. python列表(数组)

    列表(list)  就是 数组 - 列表是Python中的一个对象 - 对象(object)就是内存中专门用来存储数据的一块区域 - 之前我们学习的对象,像数值,它只能保存一个单一的数据 - 列表中可 ...

  10. 完美解决win10系统无法安装.NET Framework问题

    今天在安装willow插件的时候系统提示需要安装.NET Framework3.5的问题,当点击系统自动解决的时候,Windows系统又会提示错误,其实这也见怪不怪了,如果能自动解决的话也不会出现这种 ...