软件开发中的查找器起做什么作用呢?

软件开发中的查找器起做什么作用呢?,第1张

1.让宿主程序动态链接 C 库 libname 。

当 funcname 为 "*", 它仅仅连接该库,让库中的符号都导出给其它动态链接库使用。 否则,它查找库中的函数 funcname ,以 C 函数的形式返回这个函数。 因此,funcname 必须遵循原型 lua_CFunction (n)。

2.这是一个低阶函数。 它完全绕过了包模块系统。 和 require 不同, 它不会做任何路径查询,也不会自动加扩展名。 libname 必须是一个 C 库需要的完整的文件名,如果有必要塌弊,需要提供路径和扩展名。 funcname 必须是 C 库需要的准确名字 (这取决于使用的 C 编译器和链接器)。

这个函数在标准 C 中不支持。 因此,它只在部分平台有效 ( Windows ,Linux ,Mac OS X, Solaris, BSD, 加上支持 dlfcn 标准的 Unix 系统)。

这个路径被 require 在 Lua 加载器中做搜索时用到。

3.在启动时,Lua 用环境变量 LUA_PATH_5_3 或环境变量 LUA_PATH 来初始化这个变量。 或采用 luaconf.h 中的默认路径。 环境变量中出现的所有 "" 都会被替换成默认路径。

package.preload

保存有一些特殊模块的加载器 ()。

这个变量仅仅是对真正那张表的引用; 改变这个值并不会改变 require 使用的表。

package.searchers

用于 require 控制如何拆衫巧加载模块的表。

4.这张表内的每一项都是一个 查找器函数。 当查找一个模块时, require 按次序调用这些查找器, 并传入模块名(require 的参数)作为唯一的一个参数。 此函数可以返回另一个函数(模块的 加载器)加上另一个将传递给这个加载器的参数。 或是返回一个描述为何没有找到这个模块的字符串 (或是返回 nil 什么也不想说)。

Lua 用四个查找器函数初始化这张表。

5.第一个查找器就是简单的在 package.preload 表中查找加载器。

第二个查找器用于查找 Lua 库的加载库。 它使用旅键储存在 package.path 中的路径来做查找工作。 查找过程和函数 package.searchpath 描述的一致。

第三个查找器用于查找 C 库的加载库。 它使用储存在 package.cpath 中的路径来做查找工作。 同样, 查找过程和函数 package.searchpath 描述的一致。 例如,如果 C 路径是这样一个字符串

路径是一个包含有一系列以分号分割的 模板 构成的字符串。 对于每个模板,都会用 name 替换其中的每个问号(如果有的话)。 且将其中的 sep (默认是点)替换为 rep (默认是系统的目录分割符)。 然后尝试打开这个文件名。

例如,如果路径是字符串

路径查找器协议就是为了支持模块和已初始化包的导入,也为了给命名空间包提供组成部分,路径条目查找器槐稿必须实现 find_spec() 方法。

find_spec() 接受两个参数,即要导入模块的完整限定名称,以及(可选的)目标模块。 find_spec() 返回模块的完全填充好的规格说明。 这个规格说明总是包含“加载器”集合(但有一个例外)。

为了向导入机制提示该规格说明代表一个命名空间 portion,路径条目查找器会将 "submodule_search_locations" 设为一个包含该部分的列表。

在 3.4 版更改: find_spec() 替代了 find_loader() 和 find_module(),后两者现在都已弃用,但会在 find_spec() 未定义时被使用。

较旧的路径条目查找器可能会实现这两个已弃用的方法中的一个而没有实现 find_spec()。 为保持向后兼容,这两个方法仍会被接宴明闭受。 但是,如果在路径条目查找器上实现了 find_spec(),这两个遗留方法就会被忽略。

find_loader() 接受一个参数,即要导入模块的完整限定名称。 find_loader() 返回一个 2 元组,其中第一项是加载器而第二项是命名空间 portion。

为了向后兼容其他导入协议的实现,许多路径条目查找器也同样支持元路径查找器所支持的传统 find_module() 方法。 但是路径条目查找器 find_module() 方法的调用绝不会带有 path 参数(它们被期望记录来自对路径钩子初始调用的恰当路径信息)。

路径条目查找器的 find_module() 方法已弃用,因为它不允许路径条目查找器为命名空间包提供部分。 如果 find_loader() 和 find_module() 同时存在于晌裂一个路径条目查找器中,导入系统将总是调用 find_loader() 而不选择 find_module()。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12416287.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存