zoukankan      html  css  js  c++  java
  • Lua之基础篇

      新到一家公司,接触有些业务竟然直接通过服务器,在nginx层面就完成了,主要是基于OpenResty和Lua来实现的。打算深入了解一下这门神奇的语言。。。

      为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。

    Lua 特性

    • 轻量级: 它用标准C语言编写并以源代码形式开放,编译后仅仅一百余K,可以很方便的嵌入别的程序里。
    • 可扩展: Lua提供了非常易于使用的扩展接口和机制:由宿主语言(通常是C或C++)提供这些功能,Lua可以使用它们,就像是本来就内置的功能一样。
    • 其它特性
      • 支持面向过程(procedure-oriented)编程和函数式编程(functional programming);
      • 自动内存管理;只提供了一种通用类型的表(table),用它可以实现数组,哈希表,集合,对象;
      • 语言内置模式匹配;闭包(closure);函数也可以看做一个值;提供多线程(协同进程,并非操作系统所支持的线程)支持;
      • 通过闭包和table可以很方便地支持面向对象编程所需要的一些关键机制,比如数据抽象,虚函数,继承和重载等

    Lua 应用场景

    • 游戏开发
    • 独立应用脚本
    • Web 应用脚本
    • 扩展和数据库插件如:MySQL Proxy 和 MySQL WorkBench
    • 安全系统,如入侵检测系统

    安装

      1)Mac

    brew install lua

    开发工具:

      vscode + EmmyLua

    基本使用:

     
    数据类型:
      Lua 中有 8 个基本类型分别为:nil、boolean、number、string、userdata、function、thread 和 table。
     
     
     
    字符串:
      字符串由一对双引号或单引号来表示。
     
    数字:
      表示双精度类型的实浮点数
     
    布尔值:
      boolean 类型只有两个可选值:true(真) 和 false(假),Lua 把 false 和 nil 看作是 false,其他的都为 true,数字 0 也是 true
     
    nil:
      nil 类型表示一种没有任何有效值,它只有一个值 -- nil,例如打印一个没有赋值的变量,便会输出一个 nil 值:
      type(X)==nil 结果为 false 的原因是因为 type(type(X))==string。
      nil 作比较时应该加上双引号""
     
     
     
    字符串:
      字符串由一对双引号或单引号来表示。
      也可以用 2 个方括号 "[[]]" 来表示"一块"字符串。
     
      在对一个数字字符串上进行算术操作时,Lua 会尝试将这个数字字符串转成一个数字:
     
      字符串连接符号:..
     
      字符串的长度:使用#放到变量前面 。 #str1
     
    表:
      在 Lua 里,table 的创建是通过"构造表达式"来完成,最简单构造表达式是{},用来创建一个空表。也可以在表里添加一些数据,直接初始化表
      Lua 中的表(table)其实是一个"关联数组"(associative arrays),数组的索引可以是数字或者是字符串
     
      不同于其他语言的数组把 0 作为数组的初始索引,在 Lua 里表的默认初始索引一般以 1 开始。
     
     
    函数:
      在 Lua 中,函数是被看作是"第一类值(First-Class Value)",函数可以存在变量里
      Lua 中我们可以将函数作为参数传递给函数
      Lua函数可以返回多个结果值,比如string.find,其返回匹配串"开始和结束的下标"(如果不存在匹配串返回nil)
      Lua函数中,在return后列出要返回的值的列表即可返回多值
      Lua 函数可以接受可变数目的参数,和 C 语言类似,在函数参数列表中使用三点 ... 表示函数有可变的参数
      Lua 函数可以接受可变数目的参数,和 C 语言类似,在函数参数列表中使用三点 ... 表示函数有可变的参数。
      可以通过 select("#",...) 来获取可变参数的数量
     
     
     
    线程:
      在 Lua 里,最主要的线程是协同程序(coroutine)。它跟线程(thread)差不多,拥有自己独立的栈、局部变量和指令指针,可以跟其他协同程序共享全局变量和其他大部分东西。
      线程跟协程的区别:线程可以同时多个运行,而协程任意时刻只能运行一个,并且处于运行状态的协程只有被挂起(suspend)时才会暂停。
     
    userdata:
      userdata 是一种用户自定义数据,用于表示一种由应用程序或 C/C++ 语言库所创建的类型,可以将任意 C/C++ 的任意数据类型的数据(通常是 struct 和 指针)存储到 Lua 变量中调用
     
     
     
     
     
     
    变量:
      Lua 变量有三种类型:全局变量、局部变量、表中的域。
      Lua 中的变量全是全局变量,那怕是语句块或是函数里,除非用 local 显式声明为局部变量。
      局部变量的作用域为从声明位置开始到所在语句块结束。
      变量的默认值均为 nil。
     
      应该尽可能的使用局部变量,有两个好处:
      •   1. 避免命名冲突。
      •   2. 访问局部变量的速度比全局变量更快。
     
     
     
    索引:
      对 table 的索引使用方括号 []。Lua 也提供了
      t[i] t.i -- 当索引为字符串类型时的一种简化写法 gettable_event(t,i) -- 采用索引访问本质上是一个类似这样的函数调用
     
     
     
     
    循环:
    循环类型
    描述
    在条件为 true 时,让程序重复地执行某些语句。执行语句前会先检查条件是否为 true。
    重复执行指定语句,重复次数可在 for 语句中控制。
    重复执行循环,直到 指定的条件为真时为止
    可以在循环内嵌套一个或多个循环语句(while do ... end;for ... do ... end;repeat ... until;)
     
     
    循环控制语句
      循环控制语句用于控制程序的流程, 以实现程序的各种结构方式。
      Lua 支持以下循环控制语句:
    控制语句
    描述
    退出当前循环或语句,并开始脚本执行紧接着的语句。
    将程序的控制点转移到一个标签处。
     
     
    流程控制:
    Lua 编程语言流程控制语句通过程序设定一个或多个条件语句来设定。在条件为 true 时执行指定程序代码,在条件为 false 时执行其他指定代码。
     
     
    控制结构的条件表达式结果可以是任何值,Lua认为false和nil为假,true和非nil为真。
    要注意的是Lua中 0 为 true:
     
     
     
     
     
    运算符:
    ~= 不等于
     
     
     
     
     
     
     
    判断语句:
    if condition then
    todo1
    else
    todo2
    end
     
    循环:
    for k, v in pairs(table) do
    todo
    end
     

      

  • 相关阅读:
    “做”的“累”
    举国默哀三天
    AjaxRequest
    客户端表单验证js
    书籍下载链接
    Html元素动态添加方法
    java文件读写操作
    查看oracle当前session
    转一篇有关Java的内存泄露的文章(受益哦)
    《高效能人士的七个习惯》摘录
  • 原文地址:https://www.cnblogs.com/xingxia/p/lua_basic.html
Copyright © 2011-2022 走看看