2023-5-4-Lua语言学习(一)

简介: 2023-5-4-Lua语言学习

🎉一、什么是Lua

Lua 是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。


🎉二、Lua 特性

  • 轻量级: 它用标准C语言编写并以源代码形式开放,编译后仅仅一百余K,可以很方便的嵌入别的程序里。
  • 可扩展: Lua提供了非常易于使用的扩展接口和机制:由宿主语言(通常是C或C++)提供这些功能,Lua可以使用它们,就像是本来就内置的功能一样。
  • 支持面向过程(procedure-oriented)编程和函数式编程(functional programming);
  • 自动内存管理;只提供了一种通用类型的表(table),用它可以实现数组,哈希表,集合,对象;
  • 语言内置模式匹配;闭包(closure);函数也可以看做一个值;提供多线程(协同进程,并非操作系统所支持的线程)支持;
  • 通过闭包和table可以很方便地支持面向对象编程所需要的一些关键机制,比如数据抽象,虚函数,继承和重载等。

🎉三、Lua应用场景

  • 游戏开发
  • 独立应用脚本
  • 独立应用脚本
  • 扩展和数据库插件如:MySQL Proxy 和 MySQL WorkBench
  • 安全系统,如入侵检测系统

🎉四、Lua基础

  • 交互式编程
    Lua 提供了交互式编程模式。我们可以在命令行中输入程序并立即查看效果。

  • 脚本式编程
    我们可以将 Lua 程序代码保存到一个以 lua 结尾的文件,并执行,该模式称为脚本式编程,如我们将如下代码存储在名为 hello.lua 的脚本文件中:

  • 单行注释
    两个减号是单行注释

  • 多行注释

  • 标示符
    Lua 标示符用于定义一个变量,函数获取其他用户定义的项。标示符以一个字母 A 到 Z 或 a 到 z 或下划线 _ 开头后加上 0 个或多个字母,下划线,数字(0 到 9)。
    最好不要使用下划线加大写字母的标示符,因为Lua的保留字也是这样的。一般约定,以下划线开头连接一串大写字母的名字(比如 _VERSION)被保留用于 Lua 内部全局变量
    Lua 不允许使用特殊字符如 @, $, 和 % 来定义标示符。 Lua 是一个区分大小写的编程语言。因此在 Lua 中 Runoob 与 runoob 是两个不同的标示符。以下列出了一些正确的标示符:
  • 关键词
and break do else
elseif end false for
function if in local
nil not or repeat
return then true until
while goto

  • 全局变量
    在默认情况下,变量总是认为是全局的。
    全局变量不需要声明,给一个变量赋值后即创建了这个全局变量,访问一个没有初始化的全局变量也不会出错,只不过得到的结果是:nil。

    如果你想删除一个全局变量,只需要将变量赋值为nil。这样变量b就好像从没被使用过一样。换句话说, 当且仅当一个变量不等于nil时,这个变量即存在。
  • Lua 数据类型
    Lua 是动态类型语言,变量不要类型定义,只需要为变量赋值。 值可以存储在变量中,作为参数传递或结果返回。
    Lua 中有 8 个基本类型分别为:nil、boolean、number、string、userdata、function、thread 和 table。
数据类型 描述
nil 这个最简单,只有值nil属于该类,表示一个无效值(在条件表达式中相当于false)。
boolean 包含两个值:false和true。
number 表示双精度类型的实浮点数
string 字符串由一对双引号或单引号来表示
function 由 C 或 Lua 编写的函数
userdata 表示任意存储在变量中的C数据结构
thread 表示执行的独立线路,用于执行协同程序
table Lua 中的表(table)其实是一个"关联数组"(associative arrays),数组的索引可以是数字、字符串或表类型。在 Lua 里,table 的创建是通过"构造表达式"来完成,最简单构造表达式是{},用来创建一个空表。

  • nil(空)
    对于全局变量和 table,nil 还有一个"删除"作用,给全局变量或者 table 表里的变量赋一个 nil 值,等同于把它们删掉,执行下面代码就知:

    nil 作比较时应该加上双引号 ,type(X)==nil 结果为 false 的原因是 type(X) 实质是返回的 “nil” 字符串,是一个 string 类型
  • boolean(布尔)
    boolean 类型只有两个可选值:true(真) 和 false(假),Lua 把 false 和 nil 看作是 false,其他的都为 true,数字 0 也是 true:
  • number(数字)
    Lua 默认只有一种 number 类型 – double(双精度)类型(默认类型可以修改 luaconf.h 里的定义),以下几种写法都被看作是 number 类型:
  • string(字符串)
    字符串由一对双引号或单引号来表示。
    也可以用 2 个方括号 “[[]]” 来表示"一块"字符串。

    在对一个数字字符串上进行算术操作时,Lua 会尝试将这个数字字符串转成一个数字,字符串连接使用的是 … ,使用 # 来计算字符串的长度,放在字符串前面
  • table(表)
    在 Lua 里,table 的创建是通过"构造表达式"来完成,最简单构造表达式是{},用来创建一个空表。也可以在表里添加一些数据,直接初始化表,Lua 中的表(table)其实是一个"关联数组"(associative arrays),数组的索引可以是数字或者是字符串。

    不同于其他语言的数组把 0 作为数组的初始索引,在 Lua 里表的默认初始索引一般以 1 开始。

table 不会固定长度大小,有新数据添加时 table 长度会自动增长,没初始的 table 都是 nil。

  • function(函数)
    在 Lua 中,函数是被看作是"第一类值(First-Class Value)",函数可以存在变量里:

    function 可以以匿名函数(anonymous function)的方式通过参数传递:

  • thread(线程)
    在 Lua 里,最主要的线程是协同程序(coroutine)。它跟线程(thread)差不多,拥有自己独立的栈、局部变量和指令指针,可以跟其他协同程序共享全局变量和其他大部分东西。
    线程跟协程的区别:线程可以同时多个运行,而协程任意时刻只能运行一个,并且处于运行状态的协程只有被挂起(suspend)时才会暂停。
  • userdata(自定义类型)
    userdata 是一种用户自定义数据,用于表示一种由应用程序或 C/C++ 语言库所创建的类型,可以将任意 C/C++ 的任意数据类型的数据(通常是 struct 和 指针)存储到 Lua 变量中调用。
  • Lua 循环
    Lua while 循环

数值for循环

var 从 exp1 变化到 exp2,每次变化以 exp3 为步长递增 var,并执行一次 “执行体”。exp3 是可选的,如果不指定,默认为1。

for var=exp1,exp2,exp3 do  
    <执行体>  
end  

Lua repeat…until 循环

Lua 编程语言中 repeat…until 循环语句不同于 for 和 while循环,for 和 while 循环的条件语句在当前循环执行开始时判断,而 repeat…until 循环的条件语句在当前循环结束后判断。

repeat
   statements
until( condition )

Lua goto 语句

Lua 语言中的 goto 语句允许将控制流程无条件地转到被标记的语句处。

for i=1, 3 do
    if i <= 2 then
        print(i, "yes continue")
        goto continue
    end
    print(i, " no continue")
    ::continue::
    print([[i'm end]])
end

注意goto的逻辑不是跳转过去执行完一条语句再回到原点,而是执行完直接顺着逻辑接着执行下面的代码了

  • if语句
--[ 0 为 true ]
if(0)
then
    print("0 为 true")
end
  • Lua 函数
optional_function_scope function function_name( argument1, argument2, argument3..., argumentn)
    function_body
    return result_params_comma_separated
end
  • Lua 运算符

算术运算符

需要注意的一个是//是整除运算符(>=lua5.3)

关系运算符

需要注意的一个是~=是不等于,检测两个值是否相等,不相等返回 true,否则返回 false

逻辑运算符

and 逻辑与操作符。 若 A 为 false,则返回 A,否则返回 B。

or 逻辑或操作符。 若 A 为 true,则返回 A,否则返回 B。

not 逻辑非操作符。与逻辑运算结果相反,如果条件为 true,逻辑非为 false。

  • Lua 数组

数组,就是相同数据类型的元素按一定顺序排列的集合,可以是一维数组和多维数组。

Lua 数组的索引键值可以使用整数表示,数组的大小不是固定的。



目录
相关文章
|
8月前
|
Java API 索引
2023-5-4-Lua语言学习(二)
2023-5-4-Lua语言学习
46 0
|
存储 关系型数据库 MySQL
Docker(五)进阶:Docker卷(volumes)
数据卷:设计用来持久化数据的,它的生命周期独立于容器,不会因为容器被删除后自动删除,并且也不存在垃圾回收这样的机制来处理没有任何容器引用的 数据卷。
622 0
Docker(五)进阶:Docker卷(volumes)
|
应用服务中间件 网络安全 nginx
Nginx配置WebSocket 【支持wss与ws连接】
Nginx配置WebSocket 【支持wss与ws连接】
5009 0
|
9月前
|
存储 Kubernetes 网络安全
【k8s 系列】k8s 学习五,k8s 集群部署尝试
【k8s 系列】k8s 学习五,k8s 集群部署尝试
144 0
|
存储 缓存 自然语言处理
小刚带你深入浅出理解Lua语言
前言这篇文章并不是针对某个知识点深入剖析,而是聚焦在Lua语言的关键知识点覆盖和关键使用问题列举描述。能够让学习者对Lua整体有个认识(使用一门新的语言不仅仅在用的时候适应它,而是知道怎么善于使用它),同时也可以作为一个工具文档在Lua中遇到具体问题的时候能从这里索引到相应的知识点和Lua的一些原理,得到启发。 1、Lua语言的特点简单的说Lua语言是一个可扩展的嵌入型的脚本语言。它具有以下的特点
小刚带你深入浅出理解Lua语言
|
9月前
|
存储 SQL 缓存
探秘MySQL底层架构:设计与实现流程一览
Mysql,作为一款优秀而广泛使用的数据库管理系统,对于众多Java工程师来说,几乎是日常开发中必不可少的一环。无论是存储海量数据,还是高效地检索和管理数据,Mysql都扮演着重要的角色。然而,除了使用Mysql进行日常开发之外,我们是否真正了解它的底层架构以及设计实现的流程呢?本篇博客将带您深入探索Mysql底层架构的设计与实现流程,帮助您更好地理解和应用这个强大的数据库系统。让我们一同揭开Mysql底层的神秘面纱,探寻其中的奥秘。
36336 14
探秘MySQL底层架构:设计与实现流程一览
|
9月前
|
存储 Kubernetes 监控
【K8S 系列】k8s 学习一,Kubernetes 基本介绍及核心组件
【K8S 系列】k8s 学习一,Kubernetes 基本介绍及核心组件
148 0
|
9月前
|
Kubernetes Ubuntu Linux
【K8S 系列】k8s 学习二,kubernetes 核心概念及初步了解安装部署方式
【K8S 系列】k8s 学习二,kubernetes 核心概念及初步了解安装部署方式
186 0
|
10月前
|
小程序 JavaScript
微信小程序集成和使用mqtt(同时支持uniapp和原生)
微信小程序集成和使用mqtt(同时支持uniapp和原生)
684 0
|
11月前
|
缓存 网络协议 网络性能优化
QOS(服务质量)
QOS(服务质量)
300 0