Lua基础学习总结

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_27990891/article/details/81105693

介绍

1. 定义:

Lua是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放,其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。

2. 特性:

  • 轻量级: 它用标准C语言编写并以源代码形式开放,编译后仅仅一百余K,可以很方便的嵌入别的程序里。
  • 可扩展: Lua提供了非常易于使用的扩展接口和机制:由宿主语言(通常是C或C++)提供这些功能,Lua可以使用它们,就像是本来就内置的功能一样。
  • 支持面向过程(procedure-oriented)编程和函数式编程(functional programming);
  • 自动内存管理;只提供了一种通用类型的表(table),用它可以实现数组,哈希表,集合,对象;

3. 应用场景

游戏开发、独立应用脚本、Web应用脚本、扩展和数据库插件如:MySQL Proxy 和 MySQL WorkBench等。

准备

> print("Hello World!")
Hello World!
  • 单行注释
--
  • 多行注释:
--[[
]]--

数据类型和变量

Lua有8个基本类型:nil、boolean、number、string、table、function、thread和userdata

1. nil(空)

Note:判断类型是否为nil时,需要加引号

> print(type(x))
nil
> print(type(x)==nil)
false
> print(type(x)=="nil")
true

这是因为type(type(X))==string

2. number

默认是double类型

3. string

  • “”、”表示一个字符串,[[]]表示一块字符串
> poem = [[
>>    I
>>    Love
>>    You
>> ]]
> print(poem)
    I
    Love
    You
  • 可以用数字字符串进行算数操作
> print("1" + 1)
2
  • 字符串用..连接
> print("I".." Love".." You")
I Love You
  • 用#放在字符串前,计算字符串长度
> len = "I Love Lua!"
> print(#len)
11
> print(#"I Love Lua!")
11
  • 替换,num忽略时全部替换
string.gsub(mainString,findString,replaceString,num)
  • 匹配模式
    . 任何字符、%a 任何字母、%c 任何控制符、%d 任何数字、%l 任何小写字母、%p 任何标点、%s 空白字符、%u 大写字母、%w 任何字母/数字,%后大写代表与任何非此类匹配,比如%A 任何非字母。后面跟:* 零或多个(尽可能长)、+ 一或多个(尽可能长)、- 零活多个(尽可能短)、? 零或一个

4. table

  • 索引默认从1开始
> tb = {"1", "2"}
> print(tb[1])
1
  • 字典类型的Table
> a = {}
> a["key"] = "value"
> key = 10
> a[key] = 22
> for k, v in pairs(a) do
>> print(k..":"..v)
>> end
key:value
10:22

5. userdata

将C/C++创建的任意数据类型,比如struct和指针,存储到Lua变量中调用。

6. 变量

  • 变量类型
    • 全局变量,没有特别说明的变量都是全局变量,默认值为nil
    • 局部变量,用local显式声明的变量是局部变量,作用域为声明到语句块结束,多使用局部变量有两个好处:访问快;避免命名冲突
    • 表中的域
  • 赋值
    Lua可以对多个变量同时赋值,变量列表和值列表的各个元素用逗号分开,当变量个数和值个数不一致时,少补nil,多忽略
> a, b, c = 1, 2, 3
> print(a, b, c)
1   2   3
> x, y = y, x   -- swap 'x' for 'y'
> a, b = f()    -- 将函数调用返回给变量
  • 索引
    索引表中的元素可以用[],也可以用.,例如t[i]、t.i

流程控制

1. 循环

  • while,wiile do … end
  • for,for do … end
  • repeat … until
  • 嵌套

2. 分支判断

  • if
  • if … else
  • 嵌套
    Note:Lua中false和nil为假,true和非nil为真,0为真!

函数

1.在Lua中,function被看作是First-Class Value,可以存在变量中。

> function count(n)
> function count(n)
>> n = n + 1
>> return n
>> end
> count1 = count
> print(count(1))
2
> print(count1(1))
2

2.匿名函数

> print((function() return 1 end)())
1

3. 函数作为参数

function max(a, b)
    if (a > b) then
        return a
    else
        return b
    end
end

function count_grade(grade1, grade2, max)
    return max(grade1, grade2)
end

print(count_grade(20, 30, max))

运行结果:

30

4. 多返回值

在返回值时用,隔开即可

5. 可变参数

用…表示可变参数,如果有固定参数,放在可变参数前面

function average(...)
    result = 0
    local arg={...}
    for i,v in ipairs(arg) do
        result = result + v
    end
    print("总共传入 " .. select("#",...) .. " 个数")
    return result/select("#",...)
end

print("平均值为",average(10,5,3,4,5,6))

运行结果:

总共传入 6 个数
平均值为    5.5

运算符

1. 算数运算符

+、-、*、/、%、^、-

2. 关系运算符

==、~=(不等于)、>、<、>=、<=

3. 逻辑运算符

and、or、not

4. 其它运算符

..(连接字符串)、#(返回字符串或表的长度)

thread

  • 在Lua里,最主要的线程是协同程序(coroutine)。它跟线程(thread)差不多,拥有自己独立的栈、局部变量和指令指针,可以跟其他协同程序共享全局变量和其他大部分东西。
  • 线程跟协程的区别:线程可以同时多个运行,而协程任意时刻只能运行一个,并且处于运行状态的协程只有被挂起(suspend)时才会暂停。

模块和包

模块类似封装库,Lua的模块是由变量、函数等组成的table。通过require加载模块,例如

require "module"

local m = require("module")

require 用于搜索 Lua 文件的路径是存放在全局变量 package.path 中,当 Lua 启动后,会以环境变量 LUA_PATH 的值来初始这个环境变量。如果没有LUA_PATH这个环境变量,也可以自定义设置,在当前用户根目录下打开.profile文件(没有则创建,打开 .bashrc 文件也可以),例如把 “~/lua/” 路径加入 LUA_PATH 环境变量里:

#LUA_PATH
export LUA_PATH="~/lua/?.lua;;"

接着,更新环境变量参数,使之立即生效。

source ~/.profile

[1] http://www.runoob.com/lua/lua-variables.html
[2] https://yq.aliyun.com/wenzhang/show_43449

猜你喜欢

转载自blog.csdn.net/sinat_27990891/article/details/81105693