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函数
  • 相关阅读:
    div定位左右居中
    highcharts绘制3D倾斜的饼图
    Echarts 图表不能渲染问题整理
    RK:系统手势监听
    RK:网络共存、Shell脚本
    泛型
    ArrayList类
    Linux(centos7)安装ClickHouse
    centos安装宝塔命令
    centos下修改hosts文件以及生效命令
  • 原文地址:https://www.cnblogs.com/skiing886/p/7609649.html
Copyright © 2011-2022 走看看