Lua 面经
时间:2020-10-21
本文章向大家介绍Lua 面经,主要包括Lua 面经使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
Lua特性
- 轻量级:用C语言编写,编译后仅仅一百余K
- 可扩展:提供了非常易于使用的扩展接口和机制
- 支持面向过程(procedure-oriented)编程和函数式编程(functional programming)
- 自动内存管理;只提供了一种通用类型的表(table),用它可以实现数组,哈希表,集合,对象
Lua数据类型
数据类型 | nil | boolean | number | string | table | userdata | function | thread |
Lua 把 false 和 nil 看作是"假",其他的都为"真":
pairs 和 ipairs区别
- pairs: 迭代 table,可以遍历表中所有的 key, 可以返回 nil
- ipairs: 迭代数组,不能返回 nil,如果遇到 nil 则退出
Lua怎么实现面向对象
面对对象是基于元表metatable,元方法__index来实现的。如果访问了lua表中不存在的元素时,就会触发lua的一套查找机制,也是凭借这个机制,才能够实现面向对象的。
元表(metatable):允许我们改变table的行为,每个行为关联了对应的元方法。当Lua试图对两个表进行相加时,先检查两者之一是否有元表,之后检查是否有一个叫"__add"的字段,若找到,则调用对应的值。
元方法(__index):当通过键来访问 table 的时候,如果这个键没有值,那么Lua就会寻找该table的metatable(假定有metatable)中的__index 键。如果__index包含一个表格,Lua会在表格中查找相应的键。
- 封装:在Lua中的类,其实都是table,因为table既可以存储普通变量又可以存储函数或者另一个table,利用这个特性,我们实现了面向对象的类中的方法、属性(字段)和构造方法
- 继承:SubClass的instance,如果在SubClass中找不到的属性和方法,将会去其元表Class(父类)的__index中查找,找到即可调用,实现了继承父类特性
- 多态:由于__index的查找特性,实例会在自己的__index中查找属性和方法,找到即可调用,不会再继续去父类中 查找,即实现了函数覆盖(C++覆盖定义:总与多态绑定在一起,覆盖发生在派生类与基类之间,两个函数必须完全相 同,且都是虚函数)功能,即多态。
-- 表A A ={} -- 表B B ={a = 99} -- 若没有_index,则查找返回0 -- 因为表B 的元方法__index没有赋值。元方法__index是用来确定一个表在被作为元表时的查找方法 -- 给表B的元方法__index进行赋值,查找则返回99 B.__index = B -- 给表B的元方法__index进行赋值,这里赋值为一个函数,则查找返回return的值 --[[B.__index = function(table, key) print("在元表中访问了变量"..key) return 88 end]] -- 设置表B为表A的元表 setmetatable(A,B) -- 再访问表A中不存在的变量a print(A.a)
Lua查找一个表元素时的规则
- 在表中查找,如果找到,返回该元素,找不到则继续
- 判断该表是否有元表,如果没有元表,返回nil,有元表则继续。
- 判断元表有没有__index方法,如果__index方法为nil,则返回nil;如果__index方法是一个表,则重复1、2、3;如果__index方法是一个函数,则返回该函数的返回值。
Lua闭包
定义:通过调用含有一个内部函数加上该外部函数持有的外部局部变量(upvalue)的外部函数(就是工厂)产生的一个实例函数
组成:外部函数+外部函数创建的upvalue(引用外包函数的局部变量,在Lua中,函数参数也是局部变量)+内部函数(闭包函数)
闭包在迭代器中的运用:迭代器需要保留上一次调用的状态和下一次成功调用的状态。
function add() local x = 0 return function () x = x + 1 return x end end --[[当函数add1执行时,函数add 已经返回,add1的局部变量x已经在栈中退出,但是add1却能访问x。这是因为x是函数add的upvalue]] add1 = add() print(add1()) --1 print(add1()) --2 --[[而add2函数执行的结果表明add1和add2并没有共享upvalue,而是单独有一份自己的upvalue]] add2 = add() print(add2()) --1
参考资料:
https://www.cnblogs.com/jiahuafu/p/9389954.html
原文地址:https://www.cnblogs.com/cancantrbl/p/13854919.html
- Android Material Design系列之RecyclerView和CardView
- 在Linux安装ASP.Net Core的运行时(Runtime)
- 使用xUnit为.net core程序进行单元测试(下1)
- Otto开发初探——微服务依赖管理新利器
- Apache Eagle——eBay开源分布式实时Hadoop数据安全方案
- Spring/Hibernate 应用性能优化的7种方法
- 浅谈应用型机器学习作为一种搜索问题
- 自相关和偏自相关的简单介绍
- 机器学习中分类与回归的差异
- 自然语言处理指南(第1部分)
- GreenDao 兼容升级,保留旧数据的---全方面解决方案
- 基于 xorm 的服务端框架 XGoServer
- 全面总结: Golang 调用 C/C++,例子式教程
- 架构之路(六):把框架拉出来
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Android用StaticLayout实现文字转化为图片效果(类似长微博发送)
- Android中Dialog自定义上下文花式菜单
- Android ListView与getView调用卡顿问题解决办法
- Android四种数据存储的应用方式
- ViewDragHelper实现QQ侧滑效果
- Android实现双击TitleBar回顶部的功能示例代码
- windows10 更新Ubuntu20.04 LTS的方法步骤
- Android 中解决Viewpage调用notifyDataSetChanged()时界面无刷新的问题
- 基于自定义Toast全面解析
- Android中DialogFragment自定义背景与宽高的方法
- Android 常用log 关键字
- Android PopWindow 设置背景亮度的实例
- ubuntu20.04设置静态ip地址(包括不同版本)
- LayoutAnimation给ListView中的item设置动态出场效果(实例)
- android studio2.3如何编译动态库的过程详解