OpenResty学习笔记(一)数据结构与控制流

原创 2016年05月31日 14:26:44

OpenResty学习笔记(一)数据结构与控制流

  第一天学习了一些lua的一些基本的数据结构跟控制流程,还有一些最基本的库。这里列一下一些不太一样的地方,方便大家参考。

  nil 是一种类型,Lua 将 nil 用于表示“无效值”。一个变量在第一次赋值前的默认值是 nil,将 nil 赋予给一个全局变量就等同于删除它
  OpenResty 的 Lua 接口还提供了一种特殊的空值,即 ngx.null,用来表示不同于 nil 的“空值”
  Lua 的字符串是不可改变的值,不能像在 c 语言中那样直接修改字符串的某个字符,而是根据修改要求来创建一个新的字符串。Lua 也不能通过下标来访问字符串的某个字符。
  在 Lua 实现中,Lua 字符串一般都会经历一个“内化”(intern)的过程,即两个完全一样的 Lua 字符串在 Lua 虚拟机中只会存储一份。每一个 Lua 字符串在创建时都会插入到   Lua 虚拟机内部的一个全局的哈希表中。 这意味着创建相同的 Lua 字符串并不会引入新的动态内存分配操作,所以相对便宜(但仍有全局哈希表查询的开销),内容相同的 Lua 字符串不会占用多份存储空间,已经创建好的 Lua 字符串之间进行相等性比较时是 O(1) 时间度的开销,而不是通常见到的 O(n)

  字符串还可以用一种长括号(即[[ ]])括起来的方式定义。 我们把两个正的方括号(即[[ )间插入 n 个等号定义为第 n 级正长括号。 
就是说,0 级正的长括号写作 [[ , 一级正的长括号写作 [=[ ,如此等等。 反的长括号也作类似定义; 举个例子,4 级反的长括号写作 ]====] 。
 一个长字符串可以由任何一级的正的长括号开始,而由第一个碰到的同级反的长括号结束。 整个词法分析过程将不受分行限制,不处理任何转义符,并且忽略掉任何不同级别的长括号。
 这种方式描述的字符串可以包含任何东西,当然本级别的反长括号除外。 例:[[abc\nbc]],里面的 "\n" 不会被转义。
  在 Lua 中,函数 也是一种数据类型,函数可以存储在变量中,可以通过参数传递给其他函数,还可以作为其他函数的返回值
  Lua 中的 and 和 or 是不同于 c 语言的。在 c 语言中,and 和 or 只得到两个值 1 和 0,其中 1 表示真,0 表示假。而 Lua 中 and 的执行过程是这样的:
    a and b 如果 a 为 nil,则返回 a,否则返回 b;
    a or b 如果 a 为 nil,则返回 b,否则返回 a。
    注意:所有逻辑操作符将 false 和 nil 视作假,其他任何值视作真,对于 and 和 or,“短路求值”,对于not,永远只返回 true 或者 false。
    值得一提的是,Lua 并没有像许多其他语言那样提供类似 continue 这样的控制语句用来立即进入下一个循环迭代(如果有的话)。因此,我们需要仔细地安排循环体里的分支,以避免这样的需求。没有提供 continue ,却也提供了另外一个标准控制语句 break ,可以跳出当前循环。例如我们遍历 table ,查找值为 11 的数组下标索引如果不想给循环设置上限的话,可以使用常量 math.huge。
  Lua 的基础库提供了 ipairs,这是一个用于遍历数组的迭代器函数。在每次循环中,i 会被赋予一个索引值,同时 v 被赋予一个对应于该索引的数组元素值。
  标准库提供了几种迭代器,包括用于迭代文件中每行的(io.lines)、 迭代 table 元素的(pairs)、迭代数组元素的(ipairs)、迭代字符串中单词的(string.gmatch)等。
  当函数参数是 table 类型时,传递进来的是 实际参数的引用,此时在函数内部对该 table 所做的修改,会直接对调用者所传递的实际参数生效,而无需自己返回结果和让调用者进行赋值。
  在常用基本类型中,除了 table 是按址传递类型外,其它的都是按值传递参数。 用全局变量来代替函数参数的不好编程习惯应该被抵制,良好的编程习惯应该是减少全局变量的使用。
当函数返回值的个数和接收返回值的变量的个数不一致时,Lua 也会自动调整参数个数。
调整规则: 若返回值个数大于接收变量的个数,多余的返回值会被忽略掉; 若返回值个数小于参数个数,从左向右,没有被返回值初始化的变量会被初始化为 nil。
当一个函数有一个以上返回值,且函数调用不是一个列表表达式的最后一个元素,那么函数调用只会产生一个返回值,也就是第一个返回值。如果你确保只取函数返回值的第一个值,可以使用括号运算符
  由于 string.byte 只返回整数,而并不像 string.sub 等函数那样(尝试)创建新的 Lua 字符串, 因此使用 string.byte 来进行字符串相关的扫描和分析是最为高效的,尤其是在被 LuaJIT 2 所 JIT 编译之后。

版权声明:本文为博主原创文章,未经博主允许不得转载。

OpenResty 执行阶段的概念和用途

主要还是 Nginx 的执行阶段知识了,都是因为 OR 才会那么深刻, 它有些自己的阶段。 主要还是参照 春哥的 Nginx 教程 请多读几遍,如果不清楚nginx的执行阶段就无法充分利用 openr...
  • lzz957748332
  • lzz957748332
  • 2017年01月12日 01:19
  • 1364

nginx学习(十四)——lua-nginx-module

参考地址: https://github.com/openresty/lua-nginx-module nginx api for lua https://github.com/openresty/l...
  • xxcupid
  • xxcupid
  • 2016年09月14日 16:19
  • 424

Nginx安装lua-nginx-module模块

ngx_lua_module 是一个nginx http模块,它把 lua 解析器内嵌到 nginx,用来解析并执行lua 语言编写的网页后台脚本 特性很牛叉,可自行百度查看,这里主要是示范一下,...
  • Dexter_Wang
  • Dexter_Wang
  • 2017年05月09日 14:05
  • 227

nginx 如何安装 nginx_lua_module 模块 以及 echo-nginx-module 模块

ngx_lua_module 是一个nginx http模块,它把 lua 解析器内嵌到 nginx,用来解析并执行lua 语言编写的网页后台脚本。 特性: 支持Windows和Lin...
  • xiaofei0859
  • xiaofei0859
  • 2015年08月28日 14:58
  • 1621

Nginx安装lua-nginx-module模块

Nginx安装lua-nginx-module模块ngx_lua_module 是一个nginx http模块,它把 lua 解析器内嵌到 nginx,用来解析并执行lua 语言编写的网页后台脚本特性...
  • qq_25551295
  • qq_25551295
  • 2016年06月23日 16:37
  • 14610

Lua-nginx-module的安装

Lua-nginx-module的安装 该模块的安装可以直接安装集成包OpenResty,也可以一个一个模块的逐步安装,下面就这两个方法进行介绍: 不管是单模块安装还是直接安装集成包 Zlib,...
  • jklfjsdj79hiofo
  • jklfjsdj79hiofo
  • 2017年04月16日 16:26
  • 398

数据结构和算法学习笔记——图论

图 一个图 G=(V,E) 由顶点集 V 和边集 E 组成。每条边是一个点对 (v,w) ,其中 v,w∈V 。如果点对是有序的,则图称为有向图。顶点 v 和 w 邻接当且仅当 (v,w)∈E 。有...
  • u013063153
  • u013063153
  • 2017年01月22日 11:10
  • 517

数据结构学习笔记

最近在看国嵌唐老师的数据结构视频,觉得还不错,所以就把笔记记录下来 本节知识点: 1.数据之间的逻辑结构:    集合结构:数据元素之间没有特别的关系,仅同属相同集合    线性结构:...
  • yhf19881015
  • yhf19881015
  • 2013年09月05日 16:51
  • 7231

nginx+lua_module安装

1,LuaJit安装 # cd /usr/local/src # git clone http://luajit.org/git/luajit-2.0.git # cd luajit-2.0 # m...
  • leonpengweicn
  • leonpengweicn
  • 2015年12月11日 19:05
  • 837

Nginx模块-lua-nginx-module

lua-nginx-module (ngx_lua) 可在 Nginx 中嵌入 Lua 语言。让 Nginx 可以支持 Lua 强大的语法 https://github.com/saga/lua...
  • jnan77
  • jnan77
  • 2013年02月18日 12:12
  • 552
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:OpenResty学习笔记(一)数据结构与控制流
举报原因:
原因补充:

(最多只允许输入30个字)