【第22期】观点:IT 行业加班,到底有没有价值?

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做负载均衡

其实这一节不算OpenResty的学习内容,因为负载均衡完全是由nginx完成的,不过也把它放在这里吧,谁让是一块学的呢。废话不多说,开始今天的学习任务。 首先介绍一个负载均衡,引用最佳实践里面的句...

OpenResty学习笔记(三) 模块

又是好长的一段时间没有更新了,长时间的出差感觉都没有精力去学习一些东西了,平时休息时间又有太多的诱惑在,所以感觉想找到一个安心学习的时候真的是不容易啊,其实是又在为自己偷懒找借口啦。好啦,言归正传,开...

程序员升职加薪指南!还缺一个“证”!

CSDN出品,立即查看!

OpenResty学习笔记(二)函数

最近这两天出差了,学习任务被搁下了实在是不应该。不说了,抓紧学习! 这一次要说一下lua的函数跟动态函数。 之前学类型的时候也学习过,函数在lua中也是一种类型,可以进行赋值。所以就有了f...

OpenResty学习笔记(四) string库

长时间的出差导致都没有时间去学习了,不得不说学习这个事情是需要一个安静跟稳定的环境的。 现在我们继续我们的学习过程,来看一下lua的string库。 首先声明一下Lua 字符串内部用来标识各个组成...

OpenResty学习笔记(九) 环境搭建

前一阵子学习了lua的基本知识,后来在学习高阶的时候感觉太抽象,效果不佳,既然学完了基础知识那就应该开始实践才对,话不多说,虚拟机装起,环境建起。 之前在windows环境上搭了一套Openrest...

OpenResty学习笔记(八) lua高阶之面向对象编程

在 Lua 中,我们可以使用表和函数实现面向对象。将函数和相关的数据放置于同一个表中就形成了一个对象。 请看文件名为 account.lua 的源码:local _M = {}local mt = ...

OpenResty学习笔记(十) 登录验证

上一篇中我们已经可能搭起一个完整的nginx的环境,那现在我们就可以做点什么了吧,先从一个最开始的事做起:登录。 一般来说登录这个动作是基本上所有的系统都需要的,就拿这个练手吧,先顺一下流程。web...

OpenResty学习笔记(七) lua高阶之元表

接下来我们开始学习lua的高阶知识,元表(metatable)。 在 Lua 5.1 语言中,元表 (metatable) 的表现行为类似于 C++ 语言中的操作符重载,例如我们可以重载 “__ad...

swift学习笔记4 控制流

注:英文部分来自官方文档switch fallthrough In contrast with switch statements in C and Objective-C, switch sta...
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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