LuaTable判空
Lua判断表为空t = {}的逻辑1if next(a) == nil thennext(table[,index])
运行程序来遍历表中的所有域。 第一个参数是要遍历的表,第二个参数是表中的某个键。 next 返回该键的下一个键及其关联的值。 如果用 nil 作为第二个参数调用 next 将返回初始键及其关联值。 当以最后一个键去调用,或是以 nil 调用一张空表时, next 返回 nil。 如果不提供第二个参数,将认为它就是 nil。 特别指出,你可以用 next(t) 来判断一张表是否是空的。
索引在遍历过程中的次序无定义, 即使是数字索引也是这样。 (如果想按数字次序遍历表,可以使用数字形式的 for 。) -Lua 5.3参考手册
(转)在项目的脚本lua中经常有这样的需求,
1、local a = {}
2、对a进行处理
3、对a是否为空表进行判断
关于对a是否为空表的判断,如果直接这样做:
if a == {} then
这样的结果就是a == {}永远返回false,是一个逻辑错误。因为这里比较的是table a和一个匿名table的内存地址。
也有些代码如此做:
...
Lua 排序算法
冒泡排序(Bubble Sort,台湾译为:泡沫排序或气泡排序)是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。
算法步骤
有一个长度为n的序列,一共需要n次外循环
在一次外循环里,比较相邻的元素。如果第一个比第二个大,就交换他们两个。这样可以保证,每次外循环结束,最右边的元素一定是最大的数。
由于每一次外循环都可以确定一个最大的数,所以在一个外循环里一共需要比较n-i次内循环
持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
动画演示
Lua 实现
local function bubbleSort(arr)
for i = 1, #arr, 1 do
for j = 1, #arr - i, 1 do
if arr[j] > arr[j+1] then
arr ...
lua学习笔记(六)
Lua面向对象封装123456789101112131415161718192021222324252627282930People={isHumen=true} -- 此处定义的元素都是相当于C++的静态成员变量-- 基类方法newfunction (o,n,a) o=o or {} setmetatable(o,self) -- self相当于C++的this指针,但是这里指代的是元类People而不是对象o self.__index=self o.name=n -- 用self代替o相当于C++中给静态成员变量赋值 o.age=a return oend-- 基类元方法__tostringfunction People:__tostring() local sum="名字为:"..self.name.."n年龄为:"..self.age -- 此处self指代的是实际调用时的对象 return sumend-- 基类方法walkfunction People:walk() print("我正在走!")end-- 创建对 ...
lua
元表(类似操作符重载)
OpenResty 最佳实践
Lua 提供的所有操作符都可以被重载:
元方法 含义
“add” + 操作
“sub” - 操作 其行为类似于 “add” 操作
“mul” * 操作 其行为类似于 “add” 操作
“div” / 操作 其行为类似于 “add” 操作
“mod” % 操作 其行为类似于 “add” 操作
“pow” ^ (幂)操作 其行为类似于 “add” 操作
“unm” 一元 - 操作
“concat” .. (字符串连接)操作
“len” # 操作
“eq” == 操作 函数 getcomphandler 定义了 Lua 怎样选择一个处理器来作比较操作 仅在两个对象类型相同且有对应操作相同的元方法时才起效
“lt” < 操作
“le” <= 操作
除了操作符之外,如下元方法也可以被重载,下面会依次解释使用方法:
元方法 含义
“index” 取下标操作用于访问 table[key]
“newindex” 赋值给指定下标 table[key] = value
“tostring” 转换成字符串
“call” ...
Lua
思考并回答以下问题:
交互基础环境配置点击下载点击下载
LuaInterface.dll:在C#代码中操作Lua代码需要依赖该文件;luanet.dll:在Lua代码中访问C#的类库脚本需要依赖该文件。
1、将两个dll文件拷贝到C#项目工程中;2、项目工程设置“引用”导入LuaInterface.dll;3、将两个dll的属性都设置成“如果较新则复制”
注意:LuaInterface需要在C#工程项目中添加引用,而luanet则不需要
php使用redis调用lua
<p> 今天看到laravel在队列处理的时候用了lua脚本<br/><a href="https://github.com/laravel/framework/blob/5.8/src/Illuminate/Queue/LuaScripts.php" target="_blank" rel="noopener noreferrer">LuaScripts.php</a><br/><del>后来查了下,原来php还有个lua的扩展,真的是孤陋寡闻了</del></p>
redis可以通过EVAL调用lua脚本 EVALeval的参数顺序: lua脚本,key数量,所有的键名,所有的值12345> eval "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" 2 key1 key2 first second1) "key1"2) "key2& ...
Lua 正确处理可变参数
为了在 Lua 里处理可变参数,我们可能会写下面这样的代码:
local function args(...)
if next({...}) then
for _, v in ipairs{...} do
print(v)
end
else
print("empty var")
end
end
args(10, 20, 30)
– output:
– 10
– 20
– 30
咋一看,貌似没什么问题,但是当传入 args(10, nil, 30) 时,发现并不符合我们的预期:
-- output:
-- 10
原因就在于 ipairs 遍历的 table 必须是一个序列。序列的数字索引必须连续。table 中间包括 nil,这样的 table 就不是序列,例如:a={10, nil, 30} 它不是序列,因为它的数字索引是 1 3 不是连续的, 所以它不是序列。为了处理这个问题,就要引入 select 了。
调用 ...
Lua
Lua函数定义格式:
optional_function_scope function function_name( argument1, argument2, argument3..., argumentn)
function_body
return result_params_comma_separated
end
说明:
1)optional_function_scope: 该参数是可选的制定函数是全局函数还是局部函数,未设置该参数默认为全局函数,如果你需要设置函数为局部函数需要使用关键字 local
2) function_name: 指定函数名称
3) argument1, argument2, argument3..., argumentn: 函数参数,多个参数以逗号隔开,函数也可以不带参数
4) function_body: 函数体,函数中需要执行的代码语句块。
5) result_params_comma_separated: 函数返回值,Lua语言函数可以返回多个值,每个值以逗号隔开。
Lua 中我们可以将函数作为参数传递给函数
多返回值 Lu ...
Lua 排序算法
设有一组关键字{K1, K2,…, Kn};排序开始就认为 K1 是一个有序序列;让 K2 插入上述表长为 1 的有序序列,使之成为一个表长为 2 的有序序列;然后让 K3 插入上述表长为 2 的有序序列,使之成为一个表长为 3 的有序序列;依次类推,最后让 Kn 插入上述表长为 n-1 的有序序列,得一个表长为 n 的有序序列。
算法步骤
从第一个元素开始,该元素可以认为已经被排序
取出下一个元素,在已经排序的元素序列中从后向前扫描
如果该元素(已排序)大于新元素,将该元素移到下一位置
重复步骤 3,直到找到已排序的元素小于或者等于新元素的位置
将新元素插入到该位置后
重复步骤 2~5
动画演示
Lua 实现
local function insertionSort(arr)
for i = 2, #arr, 1 do
local tmp = arr[i]
local j = i - 1
while j >= 1 and tmp < arr[j] do
arr[j ...
LuaFramework
思考并回答以下问题:
用Lua写逻辑时,可以先用C#实现,再转换成Lua语言。这样好吗?
Lua的几个变种:XLua、ToLua(原uLua)和Slua都可以做Unity热更,而ToLua更是提供了一个简易的热更框架--LuaFramework_UGUI,使得上手变得容易,因此选定LuaFramework_UGUI框架来实现项目的热更功能。
问:ToLua、XLua以及SLua,它们之间是什么关系?答:个人理解,Lua定义了一种语言规范,而ToLua、Xlua、Slua都是这种规范的一种实现。
问:Unity、ToLua、LuaFramework_UGUI,它们之间有什么联系?答:ToLua搭建了一个Lua语言与Unity中c#语言沟通的桥梁,借助ToLua,你可以在C#语言中调用Lua方法,也可以在Lua语言中调用C#方法。
而LuaFramework_UGUI则是基于ToLua的这种能力实现的一个热更新方案(提供包括资源包管理、下载、加载等一系列功能)。
tolua是用纯lua开发游戏逻辑,不能对C#中的代码进行修改。xlua可以通过hotfix对C#中的代码进行修改,更加方 ...