lua基础语法学习(代码片段)

果子哥丶 果子哥丶     2023-01-12     110

关键词:

学习链接

  1. https://blog.csdn.net/jiangwei0512/article/details/51057649
  2. https://blog.csdn.net/THIOUSTHIOUS/article/details/86552762
  3. https://segmentfault.com/a/1190000018641801
  4. https://cloud.tencent.com/developer/article/1043931
  5. https://github.com/openresty/lua-nginx-module

1、注释

Lua使用的注释如下:

-- 单行注释使用
--[[
    多行注释使用
    多行注释使用
]]


--[[
if x > 1 then
    -- 注释1
else
    -- 注释2
end
--]]

2、数据类型

Lua的8个基本类型:

几点说明:

  • nil类型只有nil这么一个值
  • boolean有两个值true和false。另外Lua中的所有值都可以用在条件语句中,且除了false和nil表示假,其它都表示真。比如0,它表示真。
  • 数值类型只有number,没有int、float等类型。
  • string可以用双引号,也可以用单引号指定。还可以用[[里面是字符串]],[[]]的特点是可以包含多行,可以嵌套,且不解释转移字符。
  • function和其他上述的类型一样,属于第一类值,就是说也可以存在普通的变量里面。
  • table、userdata和thread后面还会讲。

3、table库

do
    --> table.concat  连接 函数

    tab = "a", "c", "d", "b"

    --(1)
    -- 一个参数,参数为 表(tab),作用为连接 tab 中所有的 value
    print(table.concat(tab))   
    --> 输出结果: acdb

    --(2)
    -- 两个参数,参数一:表(tab),参数二:分隔符(nil)-- 作用为连接tab中所有的value,value 间以 nil 隔开
    print(table.concat(tab, nil))  
    --> 输出结果: acdb

    --(3)
    -- 三个参数,参数一:表(tab),参数二:分隔符 (" @@ ")-- 参数三:起始位置(2),作用为连接tab中所有的value,位置是从1开始算的
    -- value 间以 " @@ " 隔开, 从 tab 的第二个value开始连接,
    -- 到 tab 的 end 
    print(table.concat(tab, " @@ ", 2))  
    --> 输出结果: c @@ d @@ b

    --(4)
    -- 四个参数,参数一:表(tab),参数二:分隔符 (" - ")-- 参数三:起始位置(2),参数四:结束连接位置,作用为连
    -- 接tab中所有的value,value 间以 " - " 隔开, 从 tab 
    -- 的第二个value  开始连接,到 tab 的 第 3 个 value结束连接

    print( table.concat(tab, " - ", 2, 3))  
    --> 输出结果: c - d
    print(table.concat(tab, " ## \\n", 2, 4))   
    --> 输出结果:
    --> c ##
    --> d ##
    --> b

    --(5)
    for i,v in ipairs(tab) do
        print(i,v)
    end
    --> 输出结果:
    -- 1      a
    -- 2      c
    -- 3      d
    -- 4      b

    -- 说明 table.concat 不会改变 原始 table 即(tab) 的结构
end

4、表达式

  1. ~=相当于c语言里面的!=,不等于。
  2. table、userdata和function是引用比较,只有两个变量指向同一个对象才是相等。
  3. 逻辑运算符是"and or not",但是这里的and和or意思跟c语言有不同:
    a and b:如果a为false,则返回a,否则返回b;
    a or b :如果a为true,则返回a,否则返回b。
  4. “…”两个点,表示字符连接符;如果操作数是number,则转换为字符串:

print(1 … 2) --> 12,注意…前后需要有空格,否则会报错
注意这里1 …之间有一个空格,不然会报错。
但是如果是字符串就不需要:

print("hello".."world")	--> helloworld

5、表的构造

下面是基本例子:

table1 =                              --> 空表
names = "jack", "john", "jimmy"       --> 列表形式初始化
print(names[1])                         --> jack,下标从1开始
names[4] = "jason"                      --> 动态添加
print(names[4])                         --> jason
print(names[5])                         --> nil,因为不存在
a = x = 0, y = 1                      --> record形式初始化
print(a.x)                              --> 0
print(a["x"])                           --> 0,另一种表示方式
b = "helloworld", x = 1, "goodbye"    -->混合形式
print(b[1])                             --> helloworld
print(b.x)                              --> 1
print(b[2])                             --> goodbye
-- print(b.1)                           --> 没有这种

表中分隔可以使用逗号,也可以使用分号。
还有一种更一般的形式:

a = ["+"] = "add", ["-"] = "sub", ["*"] = "mul", ["/"] = "div",   --> 后面可以有逗号
print(a["+"])   --> add
b = [1] = "one", [2] = "two", [3] = "three"
print(b[1])     --> one

6、控制语句

IF语句

if xxx then xxx end
if xxx then xxx else xxx end
if xxx then xxx elseif xxx then xxx else xxx end

elseif可以有很多个,注意else和if中间没有空格!!

WHILE语句

while xxx do xxx end

REPEAT-UNTIL语句

repeat xxx until xxx

FOR语句

for var=exp1,exp2,exp3 do xxx end

这里for里面的语句意思是var以exp3为step,从exp1到exp2。

需要注意几点:

  • 几个exp只会运行一次,且在for循环之前;
  • var是局部变量;
  • 循环过程中不要改变var。
for x,y,z in xxx do xxx end

BREAK和RETURN语句
break退出当前循环;return退出函数并返回结果。
注意break和return只能用在一个block的结尾。如果有时候确实想要在另外的地方使用,可以用这样的方式:

do break/return end

7、函数

函数的定义:

function funcName (args)
    states
end

关于函数调用时,如果没有参数,需要使用();

如果参数是字符串或者表构造时,可以不用()。

Lua函数中实参和形参的匹配也比较不讲究,实参多于形参,多余部分会忽略;实参少于形参,少的形参会是nil。这个与多变量赋值方式一致。

函数可以返回多个值:

function func (void)
    return 1,2
end
 
a,b = func()
print(a)    --> 1
print(b)    --> 2

通过()可以是函数强制返回一个值:

function func (void)
    return 1,2
end
 
print(func())       --> 1 2
print((func()))     --> 1

Lua可以有可变参数。使用…三个点表示,在函数中用一个叫arg的table表示参数,arg中还有一个域n表示参数的个数。
下面是一个例子:

function func_1(...)
    print("The number of args: " .. #...)
    for i,v in ipairs(...) do
        print(i,v)
    end
end
func_1(0, 1, 2, 3)

打印的结果是:

The number of args: 4
1       0
2       1
3       2
4       3

Lua与Nginx

当 Nginx 标准模块和配置不能灵活地适应系统要求时,就可以考虑使用 Lua 扩展和定制 Nginx 服务。OpenResty 集成了大量精良的 Lua 库、第三方模块,可以方便地搭建能够处理超高并发、扩展性极高的 Web 服务,所以这里选择 OpenResty 提供的 lua-nginx-module 方案。

lua-nginx-module 模块中已经为 Lua 提供了丰富的 Nginx 调用 API,每个 API 都有各自的作用环境,详细描述见 Nginx API for Lua。这里只列举基本 API 的使用 。

先配一个 Lua 脚本服务,配置文件如下:

location ~ /lua_api   
    # 示例用的Nginx变量  
    set $name $host;
    default_type "text/html";  
    # 通过Lua文件进行内容处理
    content_by_lua_file /home/www/nginx-api.lua;  


content_by_lua_file :在于指定的文件<path-to-lua-script-file>包含 Lua 代码

Nginx处理顺序阶段

1)post-read
读取请求内容阶段,nginx读取并解析完请求头之后就立即开始运行;

(2)server-rewrite
server请求地址重写阶段;

(3)find-config
配置查找阶段,用来完成当前请求与location配重块之间的配对工作;

(4)rewrite
location请求地址重写阶段,当ngx_rewrite指令用于location中,就是再这个阶段运行的;

(5)post-rewrite
请求地址重写提交阶段,当nginx完成rewrite阶段所要求的内部跳转动作,如果rewrite阶段有这个要求的话;

(6)preaccess
访问权限检查准备阶段,ngx_limit_req和ngx_limit_zone在这个阶段运行,ngx_limit_req可以控制请求的访问频率,ngx_limit_zone可以控制访问的并发度;

(7)access
权限检查阶段,ngx_access在这个阶段运行,配置指令多是执行访问控制相关的任务,如检查用户的访问权限,检查用户的来源IP是否合法;

(8)post-access
访问权限检查提交阶段;

(9try-files
配置项try_files处理阶段;

(10)content
内容产生阶段,是所有请求处理阶段中最为重要的阶段,因为这个阶段的指令通常是用来生成HTTP响应内容的;

(11)log

日志模块处理阶段;

ngx_lua 运行指令

ngx_lua属于nginx的一部分,它的执行指令都包含在nginx的11个步骤之中了,相应的处理阶段可以做插入式处理,即可插拔式架构,不过ngx_lua并不是所有阶段都会运行的;另外指令可以在http、server、server if、location、location if几个范围进行配置:

lua特性和一些基础语法(代码片段)

在Lua中,你可以使用单行注释和多行注释。 单行注释中,连续两个减号"--"表示注释的开始,一直延续到行末为止。相当于C++语言中的"//"。 多行注释中,由"--[["表示注释开始,并且一直延续到"]]"为止。这种注释相当于C... 查看详情

lua基础语法(代码片段)

条件判断:ifelselua:每个if后跟then,else和if是挨着的:elseifprint函数会自动换行i=14ifi<10thenprint("i<10")elseifi>10thenprint("i>10")ifi>15thenprint("i>1 查看详情

lua从青铜到王者基础篇第二篇:lua基本语法和数据类型(代码片段)

系列文章目录文章目录系列文章目录前言🌲一、Lua基本语法1.第一个Lua程序2.交互式编程3.脚本式编程4.注释1.单行注释2.多行注释1.多行注释注意事项5.标识符6.关键词7.全局变量🌳二、Lua数据类型1.nil(空)2.boolean(布尔&... 查看详情

lua基础语法篇一(代码片段)

打印print("helloworld")注释单行注释多行注释--这是单行注释--[[这是多行注释]]赋值s="HelloWorld"--多重赋值a,b="Stringa","Stringb"--交换值,类似pythona,b="Stringa","Stringb"a,b=b,a数据类型Lua有8种基本类型,如下表类型说明nil空值,只包含一个nil... 查看详情

c++学习:1基础语法(代码片段)

C++发展史C++03只是修改了一些BUGC++11:majorC++17:major目录一、基础语法A1、cin、cout2、函数重载(Overload)3、默认参数4、extern"C"C和C++混合开发二、基础语法B5、内联函数( 查看详情

kotlin入门基础语法学习笔记(代码片段)

敲了一天的kotlin基础语法,整理归纳到一个类里面,便于以后忘记的时候复习。/***CreatedbyGGon2017/11/20.*///main函数funmain(args:Array<String>)vartestMain=TestMain()print(testMain.array())classTestMain//单例的写法compani 查看详情

shell学习基础语法(代码片段)

Shell基本语法本教程使用Bash,需要在脚本开头加上#!/bin/bash第一个Shell#!/bin/bashecho"HelloWorld!"设置权限并执行chmod+x./test.sh#使脚本具有执行权限./test.sh#执行脚本变量定义与使用定义变量的时候,变量名不加美元符$&#... 查看详情

lua特性和一些基础语法总结(lua入门到精通一)

Lua的语法基础比较简单,比较容易上手,下面总结一些学习过程中的Lua语法基础。Lua优点及特性Lua是一个小巧的脚本语言。其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。Lua由标准C... 查看详情

.bat学习-基础语法(代码片段)

...是使用于windows操作系统用来执行操作的批处理脚本 基础之前setlocal和endlocal在一个bat文件内定义变量之前,一定要文件头部调用一个命令setlocal设置临时改变系统变量,, 查看详情

scala基础语法学习(代码片段)

目录一、变量 二、数据类型三、scala中的条件表达式四、循环五、while循环六、方法6、函数7、数组(1)、定长数组(2)、变长数组(3)、遍历数组(4)、数组常用操作8、元组 9、映射Map(1&... 查看详情

android:kotlin详细入门学习指南-高阶函数-基础语法(代码片段)

...f0c;持续更新Android:Kotlin详细入门学习指南-高阶函数-基础语法(七)建议先看看前面的文章Android:Kotlin详细入门学习指南-基础语法(一)Android:Kotlin详细入门学习指南-基本类型-基础语法(二)Android:Kotl 查看详情

lua基础语法(代码片段)

条件判断:ifelselua:每个if后跟then,else和if是挨着的:elseifprint函数会自动换行i=14ifi<10thenprint("i<10")elseifi>10thenprint("i>10")ifi>15thenprint("i>15")elseprint("10<i<15")endelseifi==... 查看详情

python基础|python的基本语法(代码片段)

Python基础(一)|Python的基本语法⭐本专栏旨在对Python的基础语法进行详解,精炼地总结语法中的重点,详解难点,面向零基础及入门的学习者,通过专栏的学习可以熟练掌握python编程,同时为后续的数... 查看详情

android:kotlin详细入门学习指南-类和对象(上)-基础语法(代码片段)

...f0c;持续更新Android:Kotlin详细入门学习指南-类和对象-基础语法(四)建议先看看前面的文章Android:Kotlin详细入门学习指南-基础语法(一)Android:Kotlin详细入门学习指南-基本类型-基础语法(二)Android:Kotl 查看详情

android:kotlin详细入门学习指南-基础语法(代码片段)

Android:Kotlin详细入门学习指南-基础语法(一)本人也是在初学Kotlin,如有错误,请帮忙指出,持续更新Kotlin被Google官方认为是Android开发的一级编程语言自2019年GoogleI/O以来,Kotlin就成为了Android移动开发的首选。... 查看详情

android:kotlin详细入门学习指南-类和对象(下)-基础语法(代码片段)

...续更新Android:Kotlin详细入门学习指南-类和对象(下)-基础语法(五)建议先看看前面的文章Android:Kotlin详细入门学习指南-基础语法(一)Android:Kotlin详细入门学习指南-基本类型-基础语法(二)Android:K 查看详情

swift基础语法的学习(代码片段)

Swift基础语法的学习1.Swift中的模块化的标注;在OC中使用是:#pragmamark-标注一段的相关功能;在Swift中使用的是:MARK:-标注一段的相关功能;实现的效果如下图:2.Swift的基本“输入”,“输出”语句ÿ... 查看详情

c++基础学习(01)——基本语法(代码片段)

文章目录C++基本语法C++程序结构C++基本语法对象:对象具有状态和行为。比如:一个人的状态-名字、性别、出生日期等等。对象是类的实例。类:类可以定义为描述对象行为/状态的模板/蓝图。方法... 查看详情