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 编译之后。

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

相关文章推荐

简明pyton教程学习笔记 6-10 控制流+函数+模块+数据结构+解决问题

elif从句:它事实上把两个相关联的if else-if else语句合并为一个if-elif-else语句。 在while循环中使用一个else从句。 for..in是另外一个循环语句,它在...

简明python教程学习笔记(五)-控制流

在Python中有三种控制流语句——if、for和while。 if语句 if语句用来检验一个条件, 如果 条件为真,我们运行一块语句(称为 if-块 ), 否则 我们处理另外一块语句(称为 else...

Linux系统学习笔记:异常控制流

程序计数器中指令的地址的过渡称为控制转移,控制转移的序列称为处理器的控制流。最简单的是平滑流。跳转、调用和返回等指令会造成平滑流的突变,来对内部的程序状态中的变化做出反应。系统也需要能够对系统状态的变...

Swift 学习笔记 3-控制流

欢迎加QQ群讨论:157672725一、条件语句if语句1.在if语句中,条件必须是一个布尔表达式【if(0)这样的写法是错的,因为0不是布尔表达式】 2.if( )的括号可写可不写var scor...
  • catch01
  • catch01
  • 2015年09月03日 21:44
  • 281

“Python"学习笔记(五)(控制流)

在Python中,有三种控制流类型,一种是顺序结构,就是指按顺序执行的结构,第二中是分支结构,第三中是循环结构。分支结构if语句:python中通过if语句来判断执行那个代码片段#-*- coding...

CSAPP学习笔记(异常控制流1)

1:诸如子进程结束之后父进程需要被告知,有时候应用程序需要系统调用,内核通过上下文切换将控制从一个进程切换到另一个进程,还有一个进程发送信号到另一个进程时接收者转而到它的信号处理函数去执行等等,我们的...

iOS开发学习笔记 2-3 C语言部分 控制流

一、代码块 使用{}括起来的代码,就可以称为一个代码块,代码块可以由一条件或多条语句组成,多条语句是一个整体; 语句以;号结束,一条语句是一个整体。 二、控制流 1...
  • lboboby
  • lboboby
  • 2014年04月21日 10:22
  • 794

Swift学习笔记(7)--控制流

1.For循环 //1.条件递增 for var index = 0; index < 3; ++index { println("index is \(index)") } ...

Kotlin学习笔记——控制流和跳转

if表达式// Traditional usage var max = a if (a < b) max = b // With else var max: Int if (a > b) ...

Python学习笔记 控制流和函数

控制流条件语句Python只有一种条件语句,那就是if语句。如果需要多重分支,使用if-elif-else结构。Python没有switch语句,条件语句只有if这么一种。而且在Python中表达某个...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:OpenResty学习笔记(一)数据结构与控制流
举报原因:
原因补充:

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