Lua
简单模式和完全模式
简单模式(simple model)拥有一个当前输入文件和一个当前输出文件,并且提供针对这些文件相关的操作。
完全模式(complete model) 使用外部的文件句柄来实现。它以一种面对对象的形式,将所有的文件操作定义为文件句柄的方法。
打开文件1file = io.open(filename [, mode])
mode 选项
模式
简介
r
只读,文件必须存在。默认。
w
只写,文件存在,则写入时覆盖原有内容。文件不存在,则创建文件。
a
附加写入,文件存在,则从文件末尾写入。文件不存在,则创建文件。
b
二进制模式,与r/w/a结合使用。
+
表示文件可读写,与r/w/a结合使用。
123456789101112file01 = io.open("test.lua", "r")file02 = io.open("test.lua", "rb")file03 = io.open("test.lua", "w")file04 = i ...
lua沙盒
背景知识Lua 给我的感觉是:各种内置函数和标准库的存在感都是比较强的。如果执行这句:
for name in pairs(_G) do print(_G) end就会把各种环境中已存在名称的打印出来:
全局变量:比如字符串 _VERSION。内置函数:比如 print、tonumber、dofile 之类。模块名称:比如 string、io、coroutine 之类。这里的全局变量 _G 就是存放环境的表(于是会有 _G 中存在着 _G._G 的递归)。
于是,平时对于全局变量的访问就可以等同于对 _G 表进行索引:
value = _G[varname] –> value = varname_G[varname] = value –> varname = value
改变函数的环境函数的上下文环境可以通过 setfenv(f, table) 函数改变,其中 table 是新的环境表,f 表示需要被改变环境的函数。如果 f 是数字,则将其视为堆栈层级(Stack Level),从而指明函数(1 为当前函数,2 为上一级函数): ...
Lua, 从入门到接着入门
0x00之前,有介绍过如何使用 Moonsharp 在 c# 工程中加载 Lua 脚本,而这一篇,打算关注于 Lua 脚本本身,介绍 Lua 的基础,入门教程(下面就是毫不严谨的介绍与分类)。
Lua 是种被广泛应用的嵌入式脚本语言,使用脚本语言可以显著缩短传统的“编写,编译,链接,运行”(edit-compile-link-run)的程序开发过程,通常,脚本是解释运行而非编译,以易学易用的姿态解决一些简单任务。如今,脚本语言更是可以在计算机系统的各个层级都能见到,并且在许多方面,高级语言与脚本语言的界限也变得模糊,比如我们在 Unity 使用的 C# 就是一例。
今天的主角 Lua 是真的牛*,它的设计目的就是为了嵌入应用程序,为其提供一种灵活的扩展和定制功能,可以很容易的与 c/c++ 的代码相互调用。可以作为扩展脚本或者配置文件(代替 xml,ini),应用场景如我们所熟悉的爱啪啪的热更新,游戏中常见的游戏模组(mod, modification)。
0x01这是基础
1. 数据类型
nil 无效值,如没有赋值的变量,也可以用来对全局变量和表(里的变量)进行删除(赋值 nil), ...
lua元表详解
元表的作用元表是用来定义对table或userdata操作方式的表
举个例子123local t1 = {1}local t2 = {2}local t3 = t1 + t2
我们直接对两个table执行+运算,会报错
1lua: /usercode/file.lua:3: attempt to perform arithmetic on local 't1' (a table value)
因为程序不知道如何对两个表执行+运行,这时候就需要通过元表来定义如何执行t1的+运算,有点类似于c语言中的运算符重载。
12345678910111213141516171819202122232425local mt = {}mt.__add = function(t1,t2) local temp = {} for _,v in pairs(t1) do table.insert(temp,v) end for _,v in pairs(t2) do table.insert(temp,v) end return tempendlocal t1 = {1,2,3}local ...
Lua编程8之面向对象
思考并回答以下问题:1.如何创建一个空表?
之前学习了table,Lua中table很重要的一个功能就是实现面向对象的架构。因为lua本身并不是面向对象的语言,但是通过table可以实现。
面向对象编程(Object Oriented Programming,OOP)是一种非常流行的计算机编程架构。
以下几种编程语言都支持面向对象编程:C# C++ Java Objective-C Ruby
面向对象特征1)** 封装 ** :指能够把一个实体的信息、功能、响应都装入一个单独的对象中的特性。
2)** 继承 ** :继承的方法允许在不改动原程序的基础上对其进行扩充,这样使得原功能得以保存,而新功能也得以扩展。这有利于减少重复编码,提高软件的开发效率。
3)** 多态 ** :同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。在运行时,可以通过指向基类的指针,来调用实现派生类中的方法。
4)** 抽象 ** :抽象(Abstraction)是简化复杂的现实问题的途径,它可以为具体问题找到最恰当的类定义,并且可以在最恰当的继承级别解释问题。
Lua 中面向对象我们知道,对象由 ...
Notepad++配置lua环境
[TOC]
0.前提准备
装好了lua
1. 安装NppExec插件
(1)菜单栏->插件->Plugin Manager->Show Plugin Manager
(2)按键盘NppExec,会检索到这个插件
(3)安装重启
2. 配置命令
(1)按F6
(2)拷贝下面命令到对话框中,修改lua.exe为自己的安装路径,注意:lua.exe的路径有空格要用双引号括起来
"D:Program Files (x86)lua-5.1.5_Win32_binlua.exe" "$(FULL_CURRENT_PATH)" & PAUSE & EXIT
(3)点击save…,存一个名字,例如:run_lua
(4)测试:点击运行,看一下下方有没有lua执行的输出,如果有就表示命令配置ok了
3. 添加命令
菜单栏->插件->NppExec->Advanced Options
(1)Associated script选择刚才保存的脚本名字,run_lua
(2)可省略。在Item name下面输入一个名 ...
Lua中的垃圾回收机制
Lua中的垃圾回收机制:弱引用表,析构器和函数collectgarbage
垃圾收集:Lua语言使用自动内存管理,程序可以创建对象(表,闭包等),但却没有函数来删除对象。Lua语言通过垃圾收集自动的删除成为垃圾的对象。
弱引用表,析构器和函数collectgarbage是在Lua语言中用来辅助垃圾收集器的主要机制。弱引用表允许收集Lua语言中还可以被程序访问的对象;析构器允许收集不在垃圾收集器直接控制下的外部对象;函数collectgarbage则允许我们控制垃圾收集器的步长。
弱引用表:垃圾收集器不能猜测我们认为哪些是垃圾,程序不会再用到的、存储在全局变量中的对象,对于Lua语言来说不是垃圾,需要我们的代码将这些对象所在的位置赋为nil,以便这些位置不会锁定可释放的对象。
简单的清除引用并不够,有些情况下,还需要程序和垃圾收集器之间的协作——当我们要保存某种类型的活跃对象的列表时,只需要将新对象插入数组即可;但是,一旦一个对象成为了数组的一部分,即使没有其他任何地方在引用它,但数组依然在引用它,无法被回收。
弱引用表就是这样一种用来告知Lua语言一个引用不应阻止对一个对象回收的的机制 ...
lua的math库
函数名
描述
示例
结果
pi
圆周率
math.pi
3.1415926535898
abs
取绝对值
math.abs(-2012)
2012
ceil
向上取整
math.ceil(9.1)
10
floor
向下取整
math.floor(9.9)
9
max
取参数最大值
math.max(2,4,6,8)
8
min
取参数最小值
math.min(2,4,6,8)
2
pow
计算x的y次幂
math.pow(2,16)
65536
sqrt
开平方
math.sqrt(65536)
256
mod
取模
math.mod(65535,2)
1
函数名
描述
示例
modf
取整数和小数部分
math.modf(20.12)
randomseed
设随机数种子
math.randomseed(os.time())
random
取随机数
math.random(5,90)
rad
角度转弧度
math.rad(180)
deg
弧度转角度
math.deg(math.pi)
exp
e ...
Lua学习笔记
学习资料地址:http://www.runoob.com/lua/lua-tutorial.html
安装环境 在Windows环境下,使用SciTE来运行Lua程序。
项目GitHub地址:https://github.com/rjpcomputing/luaforwindows/releases
上面的官方下载无法保证下载速度,我使用的是菜鸟教程分流的下载地址:http://static.runoob.com/download/LuaForWindows_v5.1.4-46.exe
开始编程 和Python一样,Lua也有交互式的编程方式。在命令行中输入lua或者lua -i启用。
同时也可以使用脚本式编程,就是将代码存放在一个lua文件中,命令行执行lua xxx.lua即可。
需要注意的是,交互式编程状态下不能使用lua命令,会出现下面的错误,这一点我也是犯了好多次:
1stdin:1: '=' expected near 'hello'
教程中没有提到怎样退出lua环境 。os.exit()退出。
基础知识注释 单 ...
lua5.2获取函数可变参数 · Infinite.ft的博客
在Lua5.2之前,函数的可变参数在函数调用的时候自动获取并放在arg变量(table)中,要访问每一可变参数只需要通过arg[0], arg[1],…..arg[m]来获取,并且arg中还有一个域n负责记录可变参数的个数,示例代码如下所示:
1234567function (a, b, ...) local sum = a + b for i = 1,arg.n do sum = sum + arg[n] end return sumend
在Lua5.2之后,需要自己手动获取可变参数,也没有了记录可变参数个数的域n,但可以通过长度运算符#获取参数个数,我想这也是为什么会去掉域n的原因,示例代码如下所示:
12345678function (a, b, ...) local arg = {...} local sum = a + b for i = 1, #arg do sum = sum + arg[i] end return sumend