lua基本概念

2022-04-18  本文已影响0人  b10c1df183f0

此文基于菜鸟教程lua教程,属于redis学习lua脚本前置内容,自己跟着执行并记录了一些问题,用于个人学习和备忘使用,深入了解请另寻其他资料

1. 安装(linux)

curl -R -O http://www.lua.org/ftp/lua-5.3.0.tar.gz
tar zxf lua-5.3.0.tar.gz
cd lua-5.3.0
make linux test
make install

2. 基本语法

2.1交互式编程

# lua -i 
Lua 5.3.0  Copyright (C) 1994-2015 Lua.org, PUC-Rio
> 

直接输入

> print("Hello World!")

回车,输出结果如下

> print("Hello World!")
Hello World!
>

2.2脚本编程

创建一个文件

#vi  hello.lua

输入

 print("Hello World!")

保存后执行

#lua hello.lua
Hello World!

2.3注释

单行注释

--注释内容

多行注释[[...]]表示把里面的内容当成一行,前面加上--,也就达到了多行注释的效果

--[[注释内容]]

如果你的注释内容本来就包含[[ 或者 ]] 这两个字符串,可以用如下写法

--[=[注释内容]=]

2.4标识符

变量以字母和下划线开头,不能以数字开头,不能使用特殊字符

lua区分大小写, hello和Hello是不同的两个变量

2.5保留字

and break do else
elseif end false for
function if in local
nil not or repeat
return then true until
while goto

3.数据类型

类型      描述
nil 空值,只有值nil属于该类型,表示一个无效值(在条件表达式中相当于false)。
boolean 包含两个值:false和true。
number 默认为双精度类型double的实浮点数(默认类型可以修改 luaconf.h 里的定义)
string 字符串由一对双引号或单引号来表示
function 由 C 或 Lua 编写的函数
userdata 表示任意存储在变量中的C数据结构
thread 表示执行的独立线路,用于执行协同程序
table Lua 中的表(table)其实是一个"关联数组"(associative arrays),数组的索引可以是数字、字符串或表类型。在 Lua 里,table 的创建是通过"构造表达式"来完成,最简单构造表达式是{},用来创建一个空表。

以下内容如无特别说明,都是交互式编程,要输入lua -i 后,再执行相应指令

3.1 nil 空

无效值,如打印不存在的变量a,便会输出nil,所有不存在或者未赋值的变量都是nil

>print(a)
nil
>print(b==nil)
true
>

给变量赋值nil等效于删除该变量

3.2 boolean 布尔

朴素的true和false,没啥说的,lua中把nil和false看做false,数字0是true

> if(0) then print("真的")else print("假的") end
真的
>

3.3 number 数字

Lua 默认只有一种 number 类型 -- double(双精度)类型(默认类型可以修改 luaconf.h 里的定义),以下几种写法都被看作是 number 类型:

print(type(2))
print(type(2.2))
print(type(0.2))
print(type(2e+1))
print(type(0.2e-1))
print(type(7.8263692594256e-06))

执行结果

number
number
number
number
number
number

3.4 string 字符串

字符串由一对双引号或单引号来表示

string1 = "this is string1"
string2 = 'this is string2'

一块字符串,和前面注释相同,用[[字符串]]包裹起来即可,里面的内容会被当成一行,执行如下

> text=[[
>> 第一行
>> 第二行
>> 第三行]]
> print(text)
第一行
第二行
第三行
>

数字类型的字符串进行算术操作时会被转换成数字计算,

> print("2" + 6)
8.0
> print("2" + "6")
8.0
> print("2 + 6")
2 + 6
> print("-2e2" * "6")
-1200.0
> print("error" + 1)
stdin:1: attempt to perform arithmetic on a string value
stack traceback:
        stdin:1: in main chunk
        [C]: in ?
>

如果是单纯的字符串拼接,应该用..

> print("a" .. 'b')
ab
> print(157 .. 428)
157428
> 

用#可以计算字符串长度,执行如下

> print(#"testString")
10
>

3.5 table 表

在 Lua 里,table 的创建是通过"构造表达式"来完成,最简单构造表达式是{},用来创建一个空表。也可以在表里添加一些数据,直接初始化表:

-- 创建一个空的 table
local tbl1 = {}
 
-- 直接初始表
local tbl2 = {"apple", "pear", "orange", "grape"}

table是一个特殊的数组,他的下标可以是数字或者字符串,某个索引没有赋值则为nil

> a={}
> a["index"]="字符串作为索引"
> index=1
> print(a["index"])
字符串作为索引
> print(a[index])
nil
> a[index]=123
> print(a[index])
123
> 

table没有固定长度大小,有新数据添加时table长度会自动增长

如果直接用#获取长度可能出现异常,长度计算源码位于ltable.c文件下的```luaH_getn``函数

> print(a[1])
123
> return print(a["index"])
字符串作为索引
> a[1]=nil
> print(#a)
0
> 
--如上,table中有两个元素,但是只返回了数字下标的总数,
字符串作为下标的没有计入长度,另外数组中多个值中部分为nil值,此时算出的长度更加没有规律,
所以计算长度要用for循环自己计数,暂时没找到可用官方api,自定义长度计算的函数如下,pairs是lua特有的迭代器,求长度时调用此函数即可
function table_leng(t)
  local leng=0
  for k, v in pairs(t) do
    leng=leng+1
  end
  return leng;
end

不同于其他语言的数组,lua中table的默认起始下标不是0,而是1

3.6 function(函数)

函数既能单独写和使用,也可以作为变量传递后使用

-- function_test.lua 脚本文件
function factorial1(n)
    if n == 0 then
        return 1
    else
        return n * factorial1(n - 1)
    end
end
print(factorial1(5))
--函数赋值给变量factorial2
factorial2 = factorial1
print(factorial2(5))

执行结果为

# lua function_test.lua 
120
120

匿名函数,将函数作为参数传递后使用

-- function_test2.lua 脚本文件
function testFun(tab,fun)
        for k ,v in pairs(tab) do
                print(fun(k,v));
        end
end


tab={key1="val1",key2="val2"};
--调用testFun时,第二个参数传递的是一个匿名函数,和上面一个例子其实差不多,只是这个函数没有在外面单独定义,而是作为匿名函数传递
testFun(tab,
function(key,val)--匿名函数
        return key.."="..val;
end
);

3.7 thread(线程)

在 Lua 里,最主要的线程是协同程序(coroutine)。它跟线程(thread)差不多,拥有自己独立的栈、局部变量和指令指针,可以跟其他协同程序共享全局变量和其他大部分东西。

线程跟协程的区别:线程可以同时多个运行,而协程任意时刻只能运行一个,并且处于运行状态的协程只有被挂起(suspend)时才会暂停。

3.8 userdata(自定义类型)

userdata 是一种用户自定义数据,用于表示一种由应用程序或 C/C++ 语言库所创建的类型,可以将任意 C/C++ 的任意数据类型的数据(通常是 struct 和 指针)存储到 Lua 变量中调用。

上一篇 下一篇

猜你喜欢

热点阅读