Lua利用自定义函数打印_G内容
前言
前几天我自己定义了一个打印table的函数,并且把实现的细节都总结在了这里—— Lua 自定义打印table函数 ,自己定义的函数一定要找一个用武之地,于是我决定拿Lua的灵魂——_G表开刀,在输出的过程中还出现了一点点问题,因此总结下来和大家分享一下。
过程
首先我是知道_G
有一个字段是_G
,即_G._G =_G
(怎么这么变态),于是我知道这样可能会导致死循环,于是在递归table之前先判断table的名字是否是_G
,如果是就直接返回,就在我认为没问题的时候,灾难还是发生了。
我发现程序运行起来以后,一个CPU占用率瞬间到达100%,一开始我还没有在意,以为这个_G表太大了,于是等了一会儿,当我发现输出文件超过300M时果断懵逼了,这绝对是死循环了啊,一个表中的内容再多,也不至于多的这样离谱,于是我手动杀死了进程。
面对300M的文本文件没有什么可怕的,拿出我的法宝Sublime Text文本编辑器打开,我发现确实是死循环了,因为_G
表中不仅仅有_G
,还有一个package.loaded
表,这个表就是环境中已经加载的内容,结果_G.package.loaded
中还有_G.package.loaded
就死循环了,当我把这种情况去掉以后就可以正常的输出结果了,其中的_G._G
和_G.package.loaded
我只输出了空表,并不是实际的内容,其他都是正常内容。
结果
_G
├── string:
| ├── sub: function: 006AEB70
| ├── upper: function: 006AEBB8
| ├── len: function: 006AE290
| ├── gfind: function: 006AE170
| ├── rep: function: 006AE3F8
| ├── find: function: 006ADFC0
| ├── match: function: 006AE368
| ├── char: function: 006ADEA0
| ├── dump: function: 006ADF30
| ├── gmatch: function: 006AE170
| ├── reverse: function: 006AE440
| ├── byte: function: 006ADE10
| ├── format: function: 006AE050
| ├── gsub: function: 006AE200
| └── lower: function: 006AE2D8
├── xpcall: function: 006AA630
├── package:
| ├── preload:
| | └── { }
| ├── loadlib: function: 006AAD80
| ├── loaded:
| | └── { }
| ├── loaders:
| | ├── 1] function: 006AAEA0
| | ├── 2] function: 006AAEE8
| | ├── 4] function: 006AAF78
| | └── 3] function: 006AAF30
| ├── cpath: ".\\?.dll;H:\\Program Files (x86)\\Lua\\?.dll;H:\\Program Files (x86)\\Lua\\loadall.dll"
| ├── config: "\\\n;\n?\n!\n-"
| ├── path: ".\\?.lua;H:\\Program Files (x86)\\Lua\\lua\\?.lua;H:\\Program Files (x86)\\Lua\\lua\\?\\init.lua;H:\\Program Files (x86)\\Lua\\?.lua;H:\\Program Files (x86)\\Lua\\?\\init.lua"
| └── seeall: function: 006AAE10
├── tostring: function: 006AA480
├── print: function: 004CE518
├── dumptree: function: 004D97C8
├── os:
| ├── exit: function: 006AD9D8
| ├── setlocale: function: 006ADBD0
| ├── date: function: 006AD828
| ├── getenv: function: 006ADA68
| ├── difftime: function: 006AD8B8
| ├── remove: function: 006ADAF8
| ├── time: function: 006ADC60
| ├── clock: function: 006AD798
| ├── tmpname: function: 006ADCF0
| ├── rename: function: 006ADB40
| └── execute: function: 006AD948
├── unpack: function: 006AA5A0
├── require: function: 006AB248
├── getfenv: function: 004CE170
├── setmetatable: function: 006AA3A8
├── next: function: 004CE3F8
├── assert: function: 004CDEE8
├── tonumber: function: 006AA3F0
├── io:
| ├── lines: function: 006ACD10
| ├── write: function: 006AD028
| ├── close: function: 006ACBF0
| ├── flush: function: 006ACC38
| ├── open: function: 006ACD58
| ├── output: function: 006ACDE8
| ├── type: function: 006ACFE0
| ├── read: function: 006ACF08
| ├── stderr: file (0FE91428)
| ├── stdin: file (0FE913E8)
| ├── input: function: 006ACC80
| ├── stdout: file (0FE91408)
| ├── popen: function: 006ACE78
| └── tmpfile: function: 006ACF50
├── rawequal: function: 004CE5A8
├── collectgarbage: function: 004CDF78
├── arg:
| ├── -1] "H:/Program Files (x86)/Lua/lua_interpreter.exe"
| └── 0] "F:\\gtest.lua"
├── getmetatable: function: 004CE200
├── module: function: 006AB1B8
├── rawset: function: 004CE6C8
├── math:
| ├── log: function: 006AF428
| ├── max: function: 006AF470
| ├── acos: function: 006AED20
| ├── huge: 1.#INF
| ├── ldexp: function: 006AF308
| ├── pi: 3.1415926535898
| ├── cos: function: 006AF080
| ├── tanh: function: 006AF8A8
| ├── pow: function: 006AF590
| ├── deg: function: 006AF0C8
| ├── tan: function: 006AF938
| ├── cosh: function: 006AEFF0
| ├── sinh: function: 006AF740
| ├── random: function: 006AF620
| ├── randomseed: function: 006AF6B0
| ├── frexp: function: 006AF278
| ├── ceil: function: 006AEF60
| ├── floor: function: 006AF158
| ├── rad: function: 006AF5D8
| ├── abs: function: 006AECD8
| ├── sqrt: function: 006AF818
| ├── modf: function: 006AF500
| ├── asin: function: 006AEDB0
| ├── min: function: 006AF4B8
| ├── mod: function: 006AF1E8
| ├── fmod: function: 006AF1E8
| ├── log10: function: 006AF398
| ├── atan2: function: 006AEE40
| ├── exp: function: 006AF110
| ├── sin: function: 006AF7D0
| └── atan: function: 006AEED0
├── debug:
| ├── getupvalue: function: 004CF670
| ├── debug: function: 006AFA58
| ├── sethook: function: 004CF748
| ├── getmetatable: function: 004CF628
| ├── gethook: function: 006AFAE8
| ├── setmetatable: function: 004CF868
| ├── setlocal: function: 004CF7D8
| ├── traceback: function: 004CF940
| ├── setfenv: function: 004CF700
| ├── getinfo: function: 004CF478
| ├── setupvalue: function: 004CF8B0
| ├── getlocal: function: 004CF508
| ├── getregistry: function: 004CF598
| └── getfenv: function: 006AFAA0
├── pcall: function: 004CE488
├── table:
| ├── setn: function: 006AC4E8
| ├── insert: function: 006AC3C8
| ├── getn: function: 006AC2A8
| ├── foreachi: function: 006AC218
| ├── maxn: function: 006AC338
| ├── foreach: function: 006AC188
| ├── concat: function: 006AC0F8
| ├── sort: function: 006AC578
| └── remove: function: 006AC458
├── newproxy: function: 006A8E40
├── type: function: 006AA510
├── coroutine:
| ├── resume: function: 006AA990
| ├── yield: function: 006AABD0
| ├── status: function: 006AAAB0
| ├── wrap: function: 006AAB40
| ├── create: function: 006AA900
| └── running: function: 006AAA20
├── _G:
| └── { }
├── select: function: 004CE758
├── gcinfo: function: 004CE0E0
├── pairs: function: 006A8DE8
├── rawget: function: 004CE638
├── loadstring: function: 004CE368
├── ipairs: function: 006A18F8
├── _VERSION: "Lua 5.1"
├── dofile: function: 004CDFC0
├── setfenv: function: 004CE7E8
├── load: function: 004CE2D8
├── error: function: 004CE050
└── loadfile: function: 004CE248
总结
- 遇到实际的问题可以先猜一下原因,然后通过代码来证明你的猜想是否正确。
Lua利用自定义函数打印_G内容相关推荐
- 自定义_Excel中的自定义函数(自定义函数的基础内容)
各位朋友,你们好. 最近和网友沟通交流Excel问题,好些问题都没法直接实现,因此用了很多自定义函数,也给头条里的朋友写过几个自定义函数(比如颜色计算的函数.提取不重复内容的函数.汉字转拼音的函数-- ...
- 利用自定义函数实现批量爬取多家公司的新闻
1 需求 利用自定义函数实现批量爬取多家公司的新闻. 2 代码实现 from selenium import webdriver import redef dongfang(company):chro ...
- javascript利用自定义函数向页面输出自定义的表格,在调用函数时通过传递的参数指定表格的行数
利用自定义函数向页面中输出自定义的表格 <!DOCTYPE html> <html lang="en"> <head><script ty ...
- oracle体育成绩字段,在Excel中利用自定义函数处理体育达标成绩
一.建立标准查分表 首先是根据<国家体育锻炼标准评分表>以16岁男子(高中一年级)为例,在Excel中建立标准评分表,把工作表命名为"评分表",建立该表的目的是为了编制 ...
- 如何利用自定义函数把阳历转换成阴历
数据库保存的是阳历日期,有时候会遇到把阳历换成阴历的需求,例如下图把阳历转换成阴历. 这个问题是我在开发报表过程中遇到的一个小需求,利用的工具是FineReport8.0版本,解决思路是首先定义一个可 ...
- 如何利用自定义函数把阳历转换成阴历 1
数据库保存的是阳历日期,有时候会遇到把阳历换成阴历的需求,例如下图把阳历转换成阴历. 这个问题是我在开发报表过程中遇到的一个小需求,利用的工具是FineReport8.0版本,解决思路是首先定义一个可 ...
- pytorch 中 利用自定义函数 get_mask_from_lengths(lengths, max_len)获取每个batch的mask
在pytorch中,经常会需要通过batch进行批量处理数据,由于每个batch中各个样本之间存在差异,经常会需要进行先padding后mask的操作. 尤其是在自然语言处理任务中,每个batch中的 ...
- 微信小程序开发4——利用自定义组件实现页面内容切换功能
首先展示一下要显示的功能:` 首先需要在开发者工具中新建一个文件夹(components),分别在文件夹中新建.js .json .wxml .wxcss四个文件(可以右键文件夹,选择新建新建(com ...
- jqprint 分页打印_利用jqprint插件打印页面内容的实现方法
{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...
最新文章
- 如何让Git适应敏捷开发流程?
- SAP 往一个角色里增加事务代码
- 谨慎能捕千秋蝉(二)——CSRF
- DL框架之PyTorch:深度学习框架PyTorch的简介、安装、使用方法之详细攻略
- Mysql中怎样使用update更新某列的数据减去指定值
- 读谷歌编码规范所想到的
- Linux中断子系统-通用框架处理
- SQL点滴系列之删除数据(五)
- linux 线程 waitforsingleobject,用Sleep或WaitForSingleObject实现线程的休眠 | 求索阁
- 使用JavaScript获取设备屏幕的宽度
- 怎么用计算机做求余,怎样用计算器求余数
- GBase8s数据库MINUS 运算符
- 如何创建一个简易的HTML网页框架
- Pycharm下载与安装教程
- css基础-属性值计算过程
- 【一周书讯】网络安全、云计算、人工智能、大数据一网打尽
- Bugku CRYPTO No Ciphertext RSA writeup by 树木
- 一个IP账号,为啥通过路由器就可供多人同时使用?
- 什么是绿色工厂?申报绿色工厂对企业有什么好处?
- 负数补码表示范围以及规格化数