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

整站优化全网营销怎么自己做网站的优化

整站优化全网营销,怎么自己做网站的优化,微博白菜网站怎么做,百度竞价排名广告前言 本篇在讲什么 理解Lua的package 本篇需要什么 对Lua语法有简单认知 对C语法有简单认知 依赖Visual Studio工具 本篇的特色 具有全流程的图文教学 重实践#xff0c;轻理论#xff0c;快速上手 提供全流程的源码内容 ★提高阅读体验★ #x1f449; ♠ 一级… 前言 本篇在讲什么 理解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 (i0; loaders[i] ! NULL; i) {lua_pushcfunction(L, loaders[i]);lua_rawseti(L, -2, i1);}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 \nLUA_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的表并且在表中注册了两个名为loadlib和seeall的函数 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中注册了两个名为require和module的函数 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://www.hkea.cn/news/14493342/

相关文章:

  • 万网网站建设教程织梦cms破解版
  • 网站建设平台信息如何做网站推广广告
  • 泉州微信网站开发公司丽水市建设监理协会网站在哪里
  • 网站开发手机销售网站用例图深圳龙岗好玩的地方
  • 深圳网站建设与推广电脑网站建设服务器
  • 嘉定房地产网站建设iapp做网站
  • 西宁摄网站制作网站可信认证必须做吗
  • 深圳网站建设制作厂家哪些网站百度收录快
  • 网站开发公司哪家最专业山西省建设工程信息网
  • 广西网站开发公司做网站视频手机
  • php 上传移动到网站根目录湖南岳阳网站开发网络公司
  • 国外建站程序企业网站的建设与管理论文
  • 域名哪个网站买最好成都房地产管理局
  • 沈阳专业网站制作设计做的网站缩小内容就全乱了
  • 如皋市城乡建设局网站域名不变 新网站
  • 鞍山网站制作谁家好wordpress宠物
  • 体检中心网站建设方案销售网站怎么做
  • 宣传页免费模板搜索引擎排名优化公司
  • 网站地图什么意思天津做网站
  • 潍坊淘宝网站建设月夜直播在线观看视频免费播放
  • 毕业设计代做网站机械中机建设一公司网站
  • 电影网站 备案室内设计师怎么找
  • 网站开发职业类别代码iis如何设置服务器上网站空间大小
  • 华丰建设股份有限公司网站合肥网站优化 新浪博客
  • 哪家网站设计比较好编程软件下载安装
  • 网站建设公司中wordpress娱乐网
  • 网站三大标签设置wordpress商城主题模板下载地址
  • 做二手市场类型的网站名字wordpress 博客 安装
  • 网站建设的项目亮点怎么写电商如何推广
  • 河南建设资格执业网站wordpress 模板标签