zoukankan      html  css  js  c++  java
  • Lua的require机制

    今天仔细读了文档,弄清楚了Lua的模块require机制。
    Lua
    是通过require函数来加载模块的,只需提供模块的名字,即可通过require(modname)来加载模块。
    Lua
    是如何通过modname来载入.lua.so的呢?

    默认加载过程

    1. package.loaded[modname]中存了模块的数据,有则直接返回
    2. 顺序遍历package.searchers,获取loader
      1. package.preload[modname]
      2. Lua Loader, 通过package.searchpath搜索package.path
      3. C Loader, 通过package.searchpath搜索package.cpath
      4. All-In-One loader
    3. 调用loader载入模块
    4. 将载入结果保存至package.loaded[modname]并返回结果

    可用lua模拟载入过程:

    function findloader(modname)

    local loader = nil

    local ext = nil

    for _,s in ipairs(package.searchers) do

    loader,ext = s(modname)

    if type(loader)=="function" then return loader,ext end

    end

    error("findloader fail")

    end

     

    function myreq(modname)

    local m = package.loaded[modname]

    if m then return m end

     

    local loader,ext = findloader(modname)

    local ret = loader(modname, ext) or true

    package.loaded[modname] = ret

    return ret

    end

    All-In-One Loader

    例如:

    require("a.b.c")

    1. 查找aC library(见过程2.3)
    2. 检查它是否有luaopen_a_b_c函数
  • 相关阅读:
    kuberbetes1.17.3二进制安装
    jvm启动cpu和负载高分析
    kubeadm安装的k8s集群证书过期处理
    Mongodb 相关链接
    perl 之 正则表达式 (简)
    ssh-copy-id 拷贝用户秘钥
    unicode & utf-8
    Python之路,Day3
    Python Day2 (二)
    find xargs 简单组合使用
  • 原文地址:https://www.cnblogs.com/skiing886/p/7609649.html
Copyright © 2011-2022 走看看