Lua语言进阶
0x01 Lua中什么值为假?12nilfalse
0x02 语法举例
当在一个数字后面写 .. 时,必须加上空格以防止被解释出错。
lua会自动在string 和numbers之间自动运行类型转换,当一个字符串使用算术操作符时,string就会被转化成数字。
123456print("10"+2) 12.0print(11..12) malformed number near '11..12'print(11 .. 12) 1112
默认索引从1开始,默认索引优先级大于[1]; [“a”]索引优先级大于a。
123456789101112131415161718192021222324252627282930313233343536373839404142431 local value = {"index", index="index", [1]=1} print(value[value[1]]) Answer: index2 local a ...
Lua table 学习笔记
Lua table定义
table类型实现了“关联数组”。“关联数组” 是一种具有特殊索引方式的数组,索引可为字符串string或(整)数number类型.
local corp = {
web = "www.google.com", --索引为字符串,key = "web", value = "www.google.com"
telephone = "12345678", --索引为字符串
staff = {"Jack", "Scott", "Gary"}, --索引为字符串,值也是一个表
100876, --相当于 [1] = 100876,此时索引为数字,key = 1, value = 100876
100191, --相当于 [2] = 100191,此时索引为数字
[10] = 360, --直接把数字索引给出 ...
Lua C API
云风Blog:Lua C API 的正确用法
C读取和调用Lua文件的库:lua.h, lauxlib.h, lualib.h
包括:读写Lua全局变量的函数、调用Lua函数的函数、运行Lua代码片段的函数、注册C函数然后可以在Lua中被调用的函数
C和Lua之间的数据交换,通过对栈上的值进行操作。栈的使用解决:Lua会自动进行垃圾回收,而C要求显示的分配内存单元;Lua中的动态类型和C的静态类型。
压入元素:
void lua_pushnil(lua_State *L); //插入空值
void lua_pushboolean(lua_State *L, int bool); //插入布尔值
void lua_pushnumber(lua_State *L, double n); //插入double
void lua_pushlstring(lua_State *L, const char* s, size_t len ...
最近关于Lua的学习篇总结(三)
Contents
</div>
<h2 id="lua和-Net的相互调用"><a href="#lua和-Net的相互调用" class="headerlink" title="lua和.Net的相互调用"></a>lua和.Net的相互调用</h2><p>由于我们公司主要是用ulua进行热更新,所以不可避免的就是luainterface呢</p>
luainterfaceluainterface包括两个核心库,一个是luainterface.dll,一个是luanet.dll可以通过luainterface完成lua和C#的相互调用
在C#中执行访问lua代码Lua lua = new Lua(); //创建Lua解析器 lua[“num”]=2; //定义一个num lua[“str”]=”a string”; //定义一个字符串 lua.newTable(“tab”); ...
Lua oop
Lua 是一门很简单的语言. 本身语言设计中没有原生的 oop 设计, 但是我们可以使用 setmetatable 来做一个伪装的 class.
setmetatable
setmetatable 类似于 python 中 __metaclass__, 是用来设置一个 table 的元 table. 如下为 coolshell 中的一个简单的例子:
fraction_a = {numerator=2, denominator=3}
fraction_b = {numerator=4, denominator=7}
如上, 我们设置了两个分数, 分别为 fraction_a, fraction_b. 我们想要对这两个分数进行相加操作. 直接使用 + 必然是不行的.
Lua 给我们提供了 setmetatable. 如下, 我们来让 fraction_a, fraction_b 可以相加.
1. 创建一个 metatable
funciton_op = {}
2. 给 metatable 的 __add 方法进行完善, 要求传 ...
lua
<h3 id="问题概述">问题概述</h3><p>在一次处理反馈问题过程中发现lua-nginx-module的balancer语法在keepalive场景下存在bug,当nginx通过已经建立的回源连接发送请求给原服务器时,连接被上游服务器主动关闭并保证再次发送这个请求时同样会被关闭(触发waf规则或者其他意外关闭),会造成nginx不断创建新的连接。</p>
验证程序http server, 模拟上游服务器:1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253import SocketServerimport datetimedef make_resp(): GMT_FORMAT = '%a, %d %b %Y %H:%M:%S GMT' now = datetime.datetime.utcnow() content = ...
Ubuntu18.04 Tengine+Lua+GraphicsMagick图片缩放
自己搭建的图片服务器,有图片缩放的需求,大致思路是可以使用nginx调用lua,使用GraphicMagick的命令来做图片缩放
说明文件夹规划lua.jaychang.cn(如/var/filebase)
12345678910111213jaychang@tengine:~$ tree /var/filebase//var/filebase/├── avatar.png├── cache│ └── thumb│ ├── avatar.png_100x100.png│ └── upload│ ├── 1.png_100x100.png #固定高和宽│ ├── 1.png_400-.png # 定高│ └── 1.png_800-.png # 定宽└── upload ├── 1.png4 directories, 8 files
其中img.xyz.com为图片站点根目录cache/thumb为缩略图存放目录upload目录存放上传的图片
链接地址对应关系原图访问地址:http://img. ...
Lua的Astar实现
用Lua实现了一个简单的方块A*寻路。A*寻路的原理是会计算路径,产生一个估值f值,这个估值是由起点到走过的路径g值和当前的位置到终点的估值h组成的。取这个估值的最小值来进行寻路,所以A*寻路的效率是由估值函数的效率决定的。代码分析:
创建一个节点,该节点保存位置和估值信息,并保留父节点,相当于整个路径是由链式节点组成。
1234567891011121314151617181920212223242526local node = {}node.__index = nodefunction (pos, h, p) local n = {} n.pos = {x = pos.x, y = pos.y} n.h = h n.parent = p n.g = 0 if p ~= nil then n.g = p.g + 1 end n.f = n.g + n.h return setmetatable(n, node)endfunction node:get_pos() return self.posendfunct ...
Lua strings
字符串或串(String)是由数字、字母、下划线组成的一串字符。Lua 语言中字符串可以使用以下三种方式来表示:
单引号间的一串字符。
双引号间的一串字符。
[[和]]间的一串字符。
转义字符用于表示不能直接显示的字符,比如后退键,回车键,等。如在字符串转换双引号可以使用 “””。
所有的转义字符和所对应的意义:
转义字符
意义
ASCII码值(十进制)
a
响铃(BEL)
007
b
退格(BS) ,将当前位置移到前一列
008
f
换页(FF),将当前位置移到下页开头
012
n
换行(LF) ,将当前位置移到下一行开头
010
r
回车(CR) ,将当前位置移到本行开头
013
t
水平制表(HT) (跳到下一个TAB位置)
009
v
垂直制表(VT)
011
代表一个反斜线字符’’’
092
’
代表一个单引号(撇号)字符
039
”
代表一个双引号字符
034
Lua Future
Future模式:参见http://www.cnblogs.com/zhiranok/archive/2011/03/26/Future_Pattern.html
使用future的好处是即利用了异步的并行能力,又保证主逻辑串行执行,保持简单。
Lua 协程sina Timyang 的介绍 http://timyang.net/lua/lua-coroutine/
lua coroutine 通过create创建一个伪线程,该“线程”通过yield可以挂起自己,通过调用resume可以使该“线程”从挂起位置继续执行。
LUA coroutine 实现 Future假设有如下应用场景:
用户登录系统,需要将用户数据从Mysql中获取用户数据,然后在LUA中实例化user_t对象。
用户登录事件由C++触发,将uid参数传递给lua
lua 并不存在mysql接口,必须委托c++完成mysql操作,而且lua state必须被单线程操作,顾我们期望LUA不能被阻塞,在单个user从mysql 载入数据
时其他user应该能够继续接受请求
故我们设计了如下解决方案:
lua中的user ...