lua学习笔记(一)

一、基本语法

  1. 常识和解析器
    1. 全局变量不需要申明,直接赋值即可创建,删除变量直接赋nil。未申明的变量不会报错,直接返回nil。
    2. lua保留字使用下划 线加大写字母的标示符,letter 的含义依赖本地环境的。

    3. 单行注释:-- 多行注释:--[[ --]]

    4. 解析器常见参数

      1. -i] 用于调试和手工测试;
      2. [-e] 直接输入代码,如:lua -e “print(“hello”)”;
      3. [-l] 加载一个lua程序库;

  2. 常见类型和值:nil(空)、boolean(布尔)、number(数字)、string(字符串)、userdata(自定义类型)、function(函数)、table(表)、thread(线程)。

    1. nil是一种类型,只有一个值nil,在lua中也叫无效值。将nil赋给一个变量,可删除变量。

    2. table(表):为整数索引时,可理解为数组;为字符串索引时,可理解为字典。还可实现一些较复杂的数据结构,如:队列、栈、集合、字典等

    3. function(函数):作为一类值,可以存储在变量中,支持参数传递或返回值,

    4. string(字符串):支持单引号、双引号、[[和]],可多行不支持转义、[[…]],可防止字符串中出现代码注释、“…”用于连接字符串

    5. number(数字):lua不区分整数和浮点数,只有普通表示法和科学技术法的区分

    6. boolean(布尔):boolean类型只有2个值:false和true。在条件表达式中,只有值为false和nil为“假”

  3. 表达式:算术运算符、关系运算符、逻辑运算符(and/or/not)、连接运算符(..)、
    1. 逻辑运算符认为 false 和 nil 是假(false),其他为真,0 也是 true.

  4. 语法:赋值、局部变量、控制语句

    1. 多重赋值:若值的个数少于变量的个数,那么多余的变量会赋为nil;若值的个数更多的话,那么多余的值丢弃。
    2. 局部变量用local作限定,其作用域仅限于声明它们的那个块,一个块就是do...end构成。
    3. lua支持数字型for & 泛型for
    4. 模拟switch,用函数和table来实现;模拟contionue,用do…end包住整个for块

  5. 函数(第5、6章):

    1. 多返回值(类似python):将函数作为单独一条语句时,丢弃所有返回值;如果函数调用不是一系列表达式的最后一个元素,那么将只产生一个值。“一系列表达式”在Lua中表现为4种情况:多重赋值、函数调用时传入的实参列表、table的构造式和return语句。

    2. 可变参数:用3个点…表示变长参数

    3. 具名形参:在调用一个函数时,实参是通过参数表中的位置取匹配形参的

    4. closure闭包:一个closure就是一个函数加上该函数所需访问的所有“非局部的变量”。

    5. 非全局函数:存储在table的字段和局部变量的函数

    6. 正确的尾调用:在函数结尾的 goto 调用,当函数最后一个动作是调用另外一个函 数时,我们称这种调用尾调用。

  6. 迭代器和泛型for

    1. 迭代器的每次调用返回集合的下一元素。迭代器的每次调用会创建一个闭包

    2. 泛型for 在自己内部保存迭代函数,它保存三个 值:迭代函数、状态常量、控制变量。

    3. 无状态迭代器:函数都是用两个变量(状态常量和控制变量)的值作为参数被调 用,一个无状态的迭代器只利用这两个值可以获取下一个元素。

    4. 多状态迭代器:使用table实现
  7. 编译、运行、错误信息
    1. lua是一种解释性语言,lua会进行代码预编译,再执行。
    2. package & error. pcall + try catch
  8. 协同程序:类似多线程程序,有独立的堆栈和局部变量,共享全局信息。
    1. 线程和协同程序的主要不同在于:在多处理器情况下,从概念上来讲多线 程程序同时运行多个线程;而协同程序是通过协作来完成,在任一指定时刻只有一个协 同程序在运行,并且这个正在运行的协同程序只在必要时才会被挂起。

    2. 协同有三个状态:挂起态(suspended)、运行态(running)、停止态(dead)

二、table & object

  1. 数据结构
    1. 数组:使用整数来索引table即可在Lua中实现数组,可动态增长。

    2. 矩阵与多维数组:一个table中的每个元素是另一个table。或者使用特定的运算方法构造单一的索引值

    3. 链表:每一个节点是一个 table,指针是这个表的一个域 (field),并且指向另一个节点(table)。

    4. 队列:使用两个索引下标,一个表示第一 个元素,另一个表示最后一个元素。

    5. 集合和包:将所有集合中的元素作为下标存放在 一个 table 里

    6. 字符串缓冲:用一个栈,在栈的底部用来保存已经生成的大的字符串,而小的串从栈定 入栈。

  2. 数据文件与持久化

  3. 元表和元方法

    1. 任何一个表都可以是其他一个表的 metatable,一组相关的表可以共享一个 metatable

    2. 可以通过元表来修改一个值的行为,使其在面对一个非预定义的操作时执行一个指定的操作

    3. 可以使用setmetatable来设置或修改任何table的元表。

    4. 在Lua代码中,只能设置table的元表。若要设置其他类型的值的元表,则必须通过C代码来完成

  4. 环境:

    1. Lua将其所有的全局变量保存在一个常规的table中,这个table称为“环境(environment)”。

    2. Lua中的全局变量不需要声明就可以使用。

    3. Lua将全局变量存放在一个普通的table中,则可以通过元表来改变其访问全局变量时的行为。

  5. 包:模块系统的一个主要目标是允许以不同的形式来共享代码。包就是一系列模块。

    1. 创建一个table,并将所有需要导出的函数放入其中,最后返回这个table。

    2. 可以在package中添加私有成员

    3. 通常写一个 package ,将所有的代码放到一个单独的文件中,执行这个文件即可加载 package。

    4. 可以将所有的公有函数声明为全局 变量,然后他们会自动作为独立的表(表指 package 的名字)存在,所有 package 必须 要做的是将这个表注册为 package 的名字。

  6. 面向对象:table就是一种对象

    1. table可以拥有状态。

    2. table拥有一个独立于其值的标识(一个self)。

    3. table具有独立于创建都和创建地的生命周期。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值