Lua快速入门

简介: Lua快速入门

一、Lua简介

1、基本概念

类型与值

table

条件 if

循环 while for

包和库


2、执行速度

C : 1

Java : 1/2-1/3

JavaScriptV8 1/3-1/10

Lua: 1/30

PHP 1/30-1/100

Python 1/30-1/100


3、嵌入性


二、开发环境

http://www.lua.org/


Mac


$ brew install lua
$ lua -v
Lua 5.3.5

hello.lua


print("hello world")
-- hello world
for i=1, 10 do
    print(i)
end
-- 1 2 3 4 5 6 7 8 9 10

三、Lua值和类型

数值类型: 1, 1.2, 3.14

字符串类型: “hello world”

布尔类型: true false


变量赋值


a = 1
b = true
print(a, b)
-- 1   true

Lua的Table

Table = 数组 + 映射

下标是从1开始

没有类型限制

大小自动扩容


数组写法


写法一:
a = {}
a[1] = 10
a[2] = 20
a[3] = "hello"
print(a[1], a[2], a[3])
-- 10  20  hello
写法二:
a = {
    10,
    20,
    "hello"
}

映射写法


写法一:
a = {}
a["hello"] = 2
a[3] = false
print(a.hello, a[3])
print(a["hello"], a[3])
写法二:
a = {
    ["hello"] = 2,
    [3] = false,
}

四、Lua函数

function add(a, b)
    return a + b
end
print(add(1, 2))
-- 3
-- 函数可以在变量之间赋值
add = function (a, b)
    return a + b
end
-- 返回多个值
function add(a, b)
    return a + b, a - b
end
print(add(1, 2))
-- 3   -1
-- 多变量赋值
a, b = 1, 2
print(a, b)
-- 1   2
-- 变量交换
a, b = b, a
print(a, b)
-- 2   1
-- 左边变量多
a, b = 1
print(a, b)
-- 1   nil
-- 右边变量多
a, b = 1, 2, 3
print(a, b)
-- 1   2

五、Lua表达式

算术表达式


a = 1 + 1
print(2)
a = 1
b = 1
print((a + b) * 3)
-- 没有++运算符
c = 1
c = c + 1
print(c)

逻辑表达式


true and false => false
true or false => true
not false => true

字符串拼接


print("hello" .. "world")
-- helloworld

作用域


-- 默认为全局变量
function foo()
    a = 1
end
foo()
print(a)
-- 1
-- local声明为局部变量
function foo()
    local a = 1
end
foo()
print(a)
-- nil

推荐:local大法好


六、Lua流程控制

if 和 while

if condition then
    ...
elseif condition then
    ...
else
    ...
end
local i = 0
while i < 10 do
    print(i)
    i = i + 1
end

for数值遍历

for i = start, end, step do
    ...
end
-- [0, 9]
for i = 1, 9 do
    print(i)
end
-- 等价于c语言
for(int i = 0; i < 10; i++){
    printf("%d\n", i);
}

for泛型遍历


pairs 和 ipairs迭代器



-- 遍历的时候是无序的
for k, v in pairs(a) do
    print(k, v)
end
-- 100 true
-- 1   20
-- foo 1
-- 2   30
-- 遍历时只搜索数组部分
for k, v in ipairs(a) do
    print(k, v)
end
-- 1   20
-- 2   30

七、Lua 包package

foo.lua


local class = {}
function class.foo(a, b)
    return a + b
end
-- 等价于
-- class.foo = function (a, b)
--     return a + b
-- end
return class

main.lua


local c = require("foo")
print(c.foo(1, 2))

区别:

require 加载文件,只运行一次(最新)

dofile 加载并运行(早期)


print("require")
for i = 1, 2 do
    print(require("demo"))
end
-- require
-- table: 0x7fd30f600000
-- table: 0x7fd30f600000
print("dofile")
for i = 1, 2 do
    print(dofile("demo.lua"))
end
-- dofile
-- table: 0x7fd30f600360
-- table: 0x7fd30f6007c0

执行字符串相当于eval

lua5.3之后不支持

dostring("")


Lua系统库

-- 注释
--[[
    长注释
]]
local t = {}
for i = 1, 10 do
    table.insert(t, 1)
end
for k, v in pairs(t) do
    print(k, v)
end
for k, v in pairs(table) do
    print(k, v)
end
for k, v in pairs(table) do
    print(k, v)
end
--[[
unpack
move
pack  
sort  
concat
insert(table, value)
remove(table, index)
]]

删除映射


local t = {}
t.a = 1
t.b = 2
t.a = nil
for k, v in pairs(t) do
    print(k, v)
end

获取长度

local t = {1, 2, 3}
print(#t)
-- 3
local s = "hello world"
print(#s)
-- 11

类型转换

local t = “hello”

print(type(t))


tonumber(“3.14”)

tostring(3.14)


字符串格式化

string.format(“hi%d”, 2)


总结

Lua特点

Table = 数组 + 映射

数组下标从1开始,数组连续使用否则是映射,自动扩展


Lua函数

万物皆值,函数也是一种值

函数支持多个返回值


Lua表达式

逻辑运算 and or not

字符串连接 …

local大法好 代码优化,作用域控制


Lua迭代器遍历

数组遍历 for k, v in ipairs(t) do…end

Table遍历 for k, v in pairs(t) do…end

相关文章
|
6月前
|
C语言
Lua快速入门教程1
Lua快速入门教程1
56 2
|
存储 JavaScript Java
lua快速入门~在js基础上,知道Lua 和 Js 的不同即可
lua快速入门~在js基础上,知道Lua 和 Js 的不同即可
64 0
|
存储 NoSQL Java
Lua高性能脚本语言快速入门
Lua高性能脚本语言快速入门
251 0
|
Java PHP Python
Lua快速入门
Lua快速入门
117 0
|
NoSQL 安全 Redis
Lua脚本快速入门
Lua脚本快速入门
2470 0
|
6月前
|
存储 NoSQL Redis
Redis的Lua脚本有什么作用?
Redis Lua脚本用于减少网络开销、实现原子操作及扩展指令集。它能合并操作降低网络延迟,保证原子性,替代不支持回滚的事务。通过脚本,代码复用率提高,且可自定义指令,如实现分布式锁,增强Redis功能和灵活性。
248 1
|
1月前
|
缓存 分布式计算 NoSQL
大数据-43 Redis 功能扩展 Lua 脚本 对Redis扩展 eval redis.call redis.pcall
大数据-43 Redis 功能扩展 Lua 脚本 对Redis扩展 eval redis.call redis.pcall
29 2
|
5月前
|
消息中间件 NoSQL Java
Redis系列学习文章分享---第六篇(Redis实战篇--Redis分布式锁+实现思路+误删问题+原子性+lua脚本+Redisson功能介绍+可重入锁+WatchDog机制+multiLock)
Redis系列学习文章分享---第六篇(Redis实战篇--Redis分布式锁+实现思路+误删问题+原子性+lua脚本+Redisson功能介绍+可重入锁+WatchDog机制+multiLock)
227 0
|
2月前
|
存储 JSON Ubuntu
如何使用 Lua 脚本进行更复杂的网络请求,比如 POST 请求?
如何使用 Lua 脚本进行更复杂的网络请求,比如 POST 请求?
|
3月前
|
存储 NoSQL Redis
Tair的发展问题之在Redis集群模式下,Lua脚本操作key面临什么问题,如何解决
Tair的发展问题之在Redis集群模式下,Lua脚本操作key面临什么问题,如何解决