2.3k 词
while1234while(条件)do 循环体end 代码示例及结果: 123456a = 0while(a < 10)do print(a) a = a + 1end 123456789100123456789 for123for var=值1,值2,值2 do 循环体end 从值1变化到值2,每次变化以值3为步长,执行一次循环体。表达式3不指定时默认为1. 代码示例及结果: 123for i = 0,10 do print(i)end 1234567891011012345678910 变化范围包含值2 for 遍历table: 1234table = {"a","b","c"}for i,v in ipairs(table) do print(i,v)end 1231 a2 b3 c repeat…until123repeat 循环体until(条件语句) 执行循环体,直到条件语句成立 代码示例及结果: 12345i = 0repeat print(i) i = i+1until(i>10) 123...
1.3k 词
脚本介绍Redis在2.6版本中推出了脚本功能,使用Lua语言(一种“卫星语言”,能够方便地嵌入到其他语言中使用)编写脚本传到Redis中执行。在Lua脚本中可以调用大部分的Redis命令,使用脚本的好处如下: 减少网络开销: 多个redis请求可以在一个脚本中一次发送一个请求,减少网络往返时延。 原子操作: Redis会将整个脚本作为一个整体执行,中间不会被其他命令插入。编写脚本的过程中无需担心会出现竞态条件,也就无需使用事务。事务可以完成的所有功能都可以用脚本实现。 复用: 客户端发送的脚本会永久存储在Redis中,其他语言开发的项目可以复用之。 代码示例1.访问频率限制123456789101112131415161718local times = redis.call('incr',KEYS[1])if times == 1 then redis.call('expire',KEYS[1],ARGV[1])end if times > tonumber(ARGV[2]) then return 0end return 1 #...
1.4k 词
题目描述根据逆波兰表示法(后缀表达式),求表达式的值。 有效的运算符包括 +, -, *, / 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。 说明: 整数除法只保留整数部分。给定逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。 tag基本计算器题 栈 样例1234567891011121314151617181920212223输入: ["10", "6", "9", "3", "+", "-11", "*", "/", "*", "17", "+", "5", "+"]输出: 22解释: ((10 * (6 / ((9 + 3) * -11))) + 17) + 5= ((10 * (6 / (12 * -11))) + 17) + 5= ((10 * (6 / -132)) + 17) + 5= ((10 * 0) + 1...
2.8k 词
思考并回答以下问题: xLua里面有一个热补丁的功能。就是你有的C#代码不用改,就可以加入热更新的功能。 为什么叫热补丁呢?已有项目中的C#代码只需要增加一些配置,不用做其他任何调整就可使用上类似热更新的功能。由于和热更新也不同,所以叫热补丁。这也是xLua首创的一项功能。 热补丁的优点有这些: 侵入性小,老项目原有代码不做任何调整就可使用。 出问题了才用Lua代码来打补丁,这时才会走到lua代码逻辑。运行时影响小,不打补丁基本和原有程序一样。 使用流程xLua的热补丁使用大体流程如下: 添加HOTFIX_ENABLE宏打开该特性(在Unity3D的File-›Build Setting-›Scripting Define Symbols下添加)。编辑器、各手机平台这个宏要分别设置。如果是自动化打包,要注意在代码里用API设置的宏是不生效的,需要在编辑器设置。 (建议平时开发业务代码不打开HOTFIX_ENABLE,只在build手机版本或者要在编译器下开发补丁时打开HOTFIX_ENABLE) 配置热补丁代码,标识要热更新的类型 执行XLua/Generate C...
13k 词
目录 Lua堆栈 Lua堆栈操作 C++调用lua Lua调用C++ There is something beautiful, just to find it. Lua堆栈 要理解Lua和C++的交互,首先要清楚Lua堆栈。简单来说Lua和C++交互是通过一个无处不在的虚拟堆栈来的。 在Lua中,lua堆栈是一个结构,堆栈的索引可以是整数或者负数,+1表示栈底,-1表示栈顶。 存入栈的数据类型包含数值,字符串,指针,table,闭包等。 1 2 3 4 5 6 7 lua_pushcclosure(L, func, 0) // 创建并压入一个闭包 lua_createtable(L, 0, 0) // 新建并压入一个表 lua_pushnumber(L, 343) // 压入一个数字 lua_pushstring(L, “mystr”) // 压入一个字符串 这里要说明的是, 你压入的类型有数值, 字符串, 表和闭包[在c中看来是不同类型的值], 但是最后都是统一用TValue这种数据结构来保存的:), 下面用图简...
4.3k 词
思考并回答以下问题:1.如何创建一个空表? 前面学习了lua编程,使用xLua热更新的时候,很多代码都是使用lua来编写的。但是到目前为止我们学习的内容都还很孤立,C#代码是C#代码,lua代码是lua代码,那么他们之间怎么联系在一起呢? 有时候,需要在C#中访问Lua中的数据或者函数,那怎么做呢? 下面例子中用到的lua代码如下: 12345678910111213141516171819202122232425string script = @" a = 1 b = 'hello world' c = true d = { f1 = 12, f2 = 34, 1, 2, 3, add = function(self, a, b) print('d.add called') return a + b end } function e() print('i am e') end ...
1.9k 词
目录 具有动态名称的全局变量 非全局环境 环境和模块 只有疯狂过,你才知道自己究竟能不能成功。 具有动态名称的全局变量 在lua中,所有的全局变量都被存在_G中,通过_G[name]可以访问到任意一个全局变量。在lua中,全局变量不需要声明就可以直接使用,但是这个可能会造成非常难以查询的bug,所以我们可以对全局变量进行简单的封装。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 setmetatable(_G, { __newindex = function(_, n) error("attempt to write to undeclared variable" .. n, 2) end, __index = function(_, n) error("attempt to read undeclared variable...
539 词
类lua不存在类的概念,每个对象定义他自己的行为并拥有自己的形状(shape)。然而,依据基于原型的语言,在lua中仿效类的概念并不难。 在lua中,使用继承的思想,很容易实现prototype(原型),如果我们有两个对象a和b,我们想让b作为a的原型,只需要1setmetatable(a,{__index = b}) 这样,对象a调用任何不存在的成员函数都会到对象b中去找,术语上,可以将b看做类,a看做对象。 例:为了使得新创建的对象拥有和Account相似的行为。我们使用__index metamethod,使新的对象继承Account,注意一个小小的优化,我们不需要创建一个额外的表作为account对象的metatable,我们可以用Account表本身作为metatable 123456function (o) o = o or {} setmetatable(o,self) self.__index = self return oend 当我们调用Account:new时,self等于Account,因此可以直接使用Accou...