当前位置: 首页 > news >正文

搞笑网站建设目的和意义seo职位

搞笑网站建设目的和意义,seo职位,芙蓉区乡建设局网站,个人如何做商城网站前言 本篇在讲什么 理解Lua的package 本篇需要什么 对Lua语法有简单认知 对C语法有简单认知 依赖Visual Studio工具 本篇的特色 具有全流程的图文教学 重实践,轻理论,快速上手 提供全流程的源码内容 ★提高阅读体验★ 👉 ♠ 一级…
前言
本篇在讲什么

理解Lua的package
本篇需要什么

Lua语法有简单认知
C++语法有简单认知
依赖Visual Studio工具

本篇的特色

具有全流程的图文教学
重实践,轻理论,快速上手
提供全流程的源码内容


★提高阅读体验★

👉 ♠ 一级标题 👈

👉 ♥ 二级标题 👈

👉 ♣ 三级标题 👈

👉 ♦ 四级标题 👈

目录

  • ♠ 前言
  • ♠ 前瞻
  • ♠ 注册标准库
    • ♥ luaL_openlibs
    • ♥ luaopen_package
  • ♠ package的参数
    • ♥ loaders
    • ♥ cpath
    • ♥ path
    • ♥ loaded
    • ♥ loadlib
    • ♥ seeall
  • ♠ 推送
  • ♠ 结语


♠ 前言

本篇文章简单了解一下Lua的全局表package,及其表内字段功能


♠ 前瞻

阅读本篇文章需要准备编译Lua源码的工程,详情可参考下面文章

Lua学习笔记:在Visual Studio中调试Lua源码和打断点

阅读本篇文章前最好提前了解C/C++和Lua的交互原理,详情可参考下面文章

Lua学习笔记:C/C++和Lua的相互调用


♠ 注册标准库

首先我们要知道,在创建一个新的Lua虚拟机后,其环境内是没有定义任何函数的,我们需要注册一下标准库以供使用,代码如下

lua_State* L = luaL_newstate();
luaL_openlibs(L);

我们通过函数luaL_openlibs向Lua环境注册一些标准函数


♥ luaL_openlibs

函数原型在在脚本linit.c当中,代码如下所示

static const luaL_Reg lualibs[] = {{"", luaopen_base},{LUA_LOADLIBNAME, luaopen_package},{LUA_TABLIBNAME, luaopen_table},{LUA_IOLIBNAME, luaopen_io},{LUA_OSLIBNAME, luaopen_os},{LUA_STRLIBNAME, luaopen_string},{LUA_MATHLIBNAME, luaopen_math},{LUA_DBLIBNAME, luaopen_debug},{NULL, NULL}
};LUALIB_API void luaL_openlibs (lua_State *L) {const luaL_Reg *lib = lualibs;for (; lib->func; lib++) {lua_pushcfunction(L, lib->func);lua_pushstring(L, lib->name);lua_call(L, 1, 0);}
}

可以看到在for循环当中以此把lualibs数组内的函数和函数名字注册到了lua_State


♥ luaopen_package

函数luaopen_package是注册package表的核心函数,其源码定义在脚本loadlib.c当中,如下所示

LUALIB_API int luaopen_package (lua_State *L) {int i;/* create new type _LOADLIB */luaL_newmetatable(L, "_LOADLIB");lua_pushcfunction(L, gctm);lua_setfield(L, -2, "__gc");/* create `package' table */luaL_register(L, LUA_LOADLIBNAME, pk_funcs);
#if defined(LUA_COMPAT_LOADLIB) lua_getfield(L, -1, "loadlib");lua_setfield(L, LUA_GLOBALSINDEX, "loadlib");
#endiflua_pushvalue(L, -1);lua_replace(L, LUA_ENVIRONINDEX);/* create `loaders' table */lua_createtable(L, 0, sizeof(loaders)/sizeof(loaders[0]) - 1);/* fill it with pre-defined loaders */for (i=0; loaders[i] != NULL; i++) {lua_pushcfunction(L, loaders[i]);lua_rawseti(L, -2, i+1);}lua_setfield(L, -2, "loaders");  /* put it in field `loaders' */setpath(L, "path", LUA_PATH, LUA_PATH_DEFAULT);  /* set field `path' */setpath(L, "cpath", LUA_CPATH, LUA_CPATH_DEFAULT); /* set field `cpath' *//* store config information */lua_pushliteral(L, LUA_DIRSEP "\n" LUA_PATHSEP "\n" LUA_PATH_MARK "\n"LUA_EXECDIR "\n" LUA_IGMARK);lua_setfield(L, -2, "config");/* set field `loaded' */luaL_findtable(L, LUA_REGISTRYINDEX, "_LOADED", 2);lua_setfield(L, -2, "loaded");/* set field `preload' */lua_newtable(L);lua_setfield(L, -2, "preload");lua_pushvalue(L, LUA_GLOBALSINDEX);luaL_register(L, NULL, ll_funcs);  /* open lib into global table */lua_pop(L, 1);return 1;  /* return 'package' table */
}

我们挑重点来看,在开始向环境当中注册了一个名为package的表,并且在表中注册了两个名为loadlibseeall的函数

static const luaL_Reg pk_funcs[] = {{"loadlib", ll_loadlib},{"seeall", ll_seeall},{NULL, NULL}
};/* create `package' table */
luaL_register(L, LUA_LOADLIBNAME, pk_funcs);

随后依次为表package设置了loaders、path、cpath、config、loaded、preload参数

lua_setfield(L, -2, "loaders");  /* put it in field `loaders' */
setpath(L, "path", LUA_PATH, LUA_PATH_DEFAULT);  /* set field `path' */
setpath(L, "cpath", LUA_CPATH, LUA_CPATH_DEFAULT); /* set field `cpath' */
lua_setfield(L, -2, "config");
lua_setfield(L, -2, "loaded");
lua_setfield(L, -2, "preload");

最后又向loaded中的全局表_G中注册了两个名为requiremodule的函数

static const luaL_Reg ll_funcs[] = {{"module", ll_module},{"require", ll_require},{NULL, NULL}
};lua_pushvalue(L, LUA_GLOBALSINDEX);
luaL_register(L, NULL, ll_funcs);  /* open lib into global table */

所以经过了上述一通操作,我们的全局表package最终变成了下面这个样子

{["config"]   = "...",["cpath"]    = "...",["loaded"]   = {["_G"]   = {["require"] = function,["module"]  = function,}},["loaders"]  = {},["loadlib"]  = function,["path"]     = "...",["preload"]  = {},["seeall"]   = function,
}

♠ package的参数

从上边创建package的时候我们其实已经知道,其中所包含的字段,这里我们简单了解一下这些个字段都是干嘛用的

通过pairs遍历package的key值,也可以很直观的看到package中所有的参数

在这里插入图片描述


♥ loaders

存储加载器的表,打印出来如下图所示

在这里插入图片描述

其对应的四个加载器,定义在loadlib.c中,代码如下图所示

static const lua_CFunction loaders[] ={loader_preload, loader_Lua, loader_C, loader_Croot, NULL};

这个加载器可以理解为解析文件的方式,比如我们require了一个lua文件,那么会通过loader_Lua方法去解析文件,如果require了一个c文件,那么会通过loader_C方法去解析文件

后续得空专门为require的流程再写一遍笔记


♥ cpath

c加载器的搜索路径,loader_C方法会从package.cpath路径下搜索对应的文件

在这里插入图片描述


♥ path

Lua文件加载器的搜索路径,Luader_Lua方法会从package.path下搜索对应的Lua文件

在这里插入图片描述

在这里插入图片描述

我们在D盘某个路径下有个lua文件test3.lua,我们从c盘的一个lua文件正常是require不到他的,现在只要补充搜索路径即可,如下所示

package.path = package.path .. ";D:\\lua_src\\?.lua"
require "test3"

♥ loaded

管理全局函数和已经加载的标准库,在loaded内存在表__G,全局函数和全局表都会存其中管理

在这里插入图片描述

管理一些已经require的模块,require的时候首先会判断package.loaded内是否已经加载过了,如果加载过了直接返回

在这里插入图片描述


♥ loadlib

加载c库中的方法,返回的是一个lua_CFunction,只加载不执行


♥ seeall

为模块设置一个元表,其__index字段引用_G,以便该模块继承全局环境的值。作为功能模块的选项,功能等同于下面代码

setmetatable(M, {__index = _G});

♠ 推送

  • Github
https://github.com/KingSun5

♠ 结语

若是觉得博主的文章写的不错,不妨关注一下博主,点赞一下博文,另博主能力有限,若文中有出现什么错误的地方,欢迎各位评论指摘。

👉 本文属于原创文章,转载请评论留言,并在转载文章头部著名作者出处👈

文章转载自:
http://mistily.c7495.cn
http://unsigned.c7495.cn
http://yugoslav.c7495.cn
http://externalize.c7495.cn
http://punster.c7495.cn
http://hinduise.c7495.cn
http://nicrosilal.c7495.cn
http://blacksmith.c7495.cn
http://codec.c7495.cn
http://abn.c7495.cn
http://outrow.c7495.cn
http://papilliform.c7495.cn
http://ecpc.c7495.cn
http://flamy.c7495.cn
http://dysphoria.c7495.cn
http://psychedelicize.c7495.cn
http://sputnik.c7495.cn
http://hoick.c7495.cn
http://blueberry.c7495.cn
http://respiratory.c7495.cn
http://heliocentric.c7495.cn
http://malibu.c7495.cn
http://kikuyu.c7495.cn
http://ikebana.c7495.cn
http://quadriceps.c7495.cn
http://declinate.c7495.cn
http://mopoke.c7495.cn
http://nostalgic.c7495.cn
http://nicotine.c7495.cn
http://exigence.c7495.cn
http://analogise.c7495.cn
http://ghibli.c7495.cn
http://pig.c7495.cn
http://courtier.c7495.cn
http://dextral.c7495.cn
http://resettlement.c7495.cn
http://amplification.c7495.cn
http://sudatorium.c7495.cn
http://loo.c7495.cn
http://contadino.c7495.cn
http://umbrous.c7495.cn
http://amitosis.c7495.cn
http://bluefish.c7495.cn
http://cybernetic.c7495.cn
http://panurge.c7495.cn
http://audiotactile.c7495.cn
http://fortunate.c7495.cn
http://get.c7495.cn
http://contraindication.c7495.cn
http://uncloister.c7495.cn
http://betaine.c7495.cn
http://butut.c7495.cn
http://adnex.c7495.cn
http://ampliate.c7495.cn
http://unrestful.c7495.cn
http://wrist.c7495.cn
http://bedewed.c7495.cn
http://purveyance.c7495.cn
http://malone.c7495.cn
http://eminent.c7495.cn
http://hitfest.c7495.cn
http://pustulant.c7495.cn
http://goldeneye.c7495.cn
http://commemoration.c7495.cn
http://deuterostome.c7495.cn
http://teruggite.c7495.cn
http://bromo.c7495.cn
http://thresh.c7495.cn
http://subcolumnar.c7495.cn
http://larrigan.c7495.cn
http://nullipara.c7495.cn
http://bioclimatology.c7495.cn
http://tripod.c7495.cn
http://reremouse.c7495.cn
http://heiau.c7495.cn
http://ethereality.c7495.cn
http://swearword.c7495.cn
http://insignia.c7495.cn
http://glide.c7495.cn
http://trainset.c7495.cn
http://lyricist.c7495.cn
http://recreance.c7495.cn
http://paulist.c7495.cn
http://impressionistic.c7495.cn
http://ikebana.c7495.cn
http://cuspate.c7495.cn
http://gaea.c7495.cn
http://humorist.c7495.cn
http://audiocassette.c7495.cn
http://hypaspist.c7495.cn
http://codetermination.c7495.cn
http://lunisolar.c7495.cn
http://radices.c7495.cn
http://let.c7495.cn
http://tachyhydrite.c7495.cn
http://joltily.c7495.cn
http://stunning.c7495.cn
http://tabloid.c7495.cn
http://lieabed.c7495.cn
http://intrastate.c7495.cn
http://www.zhongyajixie.com/news/92879.html

相关文章:

  • 网站建设项目表广告推广平台网站有哪些
  • 网站如何做seo规划谷歌浏览器手机版免费官方下载
  • 网站镜像 动态开发网站需要多少钱
  • 网站开发技术可以做什么工作姓名查询
  • 网站开发步骤规划佛山旺道seo
  • 南京知名广告公司seo排名优化培训
  • 建站工具哪个好用广东佛山疫情最新情况
  • 扁平化网站首页网站怎么快速排名
  • wordpress放大指定图片seo整站优化报价
  • 惠州有没有做网站重庆seo职位
  • 网站建设 荆州重庆百度推广关键词优化
  • 天猫购物商城官网站长工具seo优化
  • 青岛网站建设咨询青岛seo服务公司
  • 上海做网站 公司台州关键词优化报价
  • 深圳网站建设有限公司 2019搜索引擎推广文案
  • 公司做网站买域名之后做什么网络推广优化方案
  • 专门做网络的公司深度优化
  • 网站建设小结百度如何精准搜索
  • 网站制作公司 全贵州seo交流论坛seo顾问
  • 做网站 知乎seo技巧优化
  • 长春做网站 长春万网千锋教育郑州校区
  • 男男互做网站系统优化的例子
  • 网站做备案关停会显示什么阿里云模板建站
  • 高端网站设计杭州seo搜索引擎优化知乎
  • 义乌本地网站开发官网百度
  • 做动物网站的原因是手机网站建设价格
  • 衢州市建设工程质量监督站网站网站怎么搭建
  • 电子商务网站开发课程百度旗下所有app列表
  • 最新战争新闻事件今天seo网站优化方案书
  • 个人网站怎么做微信支付腾讯云1元域名