• openresty开发系列21--lua的模块


    openresty开发系列21--lua的模块

    从lua5.1开始,Lua 加入了标准的模块管理机制,Lua 的模块是由变量、函数等已知元素组成的 table,

    因此创建一个模块很简单,就是创建一个 table,然后把需要导出的常量、函数放入其中,最后返回这个 table 就行。

    一)模块定义

    模块的文件名 和 模块定义引用名称要一致

    -- 文件名为 model.lua
    -- 定义一个名为 model 的模块
    model = {}
     
    -- 定义一个常量
    model.constant = "这是一个常量"
     
    -- 定义一个函数
    function model.func1()
        print("这是一个公有函数")
    end
     
    local function func2()
        print("这是一个私有函数!")
    end
     
    function model.func3()
        func2()
    end
     
    return model

    二)require 函数
    Lua提供了一个名为require的函数用来加载模块。要加载一个模块,只需要简单地调用就可以了。例如:

    require("<模块名>")  或者  require "<模块名>"

    执行 require 后会返回一个由模块常量或函数组成的 table,并且还会定义一个包含该 table 的全局变量。

    -- test_model.lua 文件
    -- model 模块为上文提到 model.lua

    require("model")
     
    print(model.constant)
     
    model.func3()


    另一种写法,给加载的模块定义一个别名变量,方便调用

    local m = require("model")
     
    print(m.constant)
     
    m.func3()

    以上代码执行结果为:

    这是一个常量
    这是一个私有函数!


    如:模块定义的model,为local修饰为局部变量,那只能采用local m = require("model") 引用

    三)require 加载机制

    我们使用require命令时,系统需要知道引入哪个路径下的model.lua文件。

    require 用于搜索 Lua 文件的路径是存放在全局变量 package.path 中,

    当 Lua 启动后,会以环境变量 LUA_PATH 的值来初始这个环境变量。
    如果没有找到该环境变量,则使用一个编译时定义的默认路径来初始化。

    lua文件的路径存放在全局变量package.path中,默认的package.path的值为 print(package.path)
    ./?.lua;/usr/local/openresty/luajit/share/luajit-2.1.0-beta3/?.lua;/usr/local/share/lua/5.1/?.lua;/usr/local/share/lua/5.1/?/init.lua;/usr/local/openresty/luajit/share/lua/5.1/?.lua;/usr/local/openresty/luajit/share/lua/5.1/?/init.lua

    我们运行require("model");相当于把model替换上面的?号,lua就会在那些目录下面寻找model.lua如果找不到就报错。
    所以我们就知道为什么会报错了。

    那我们如何解决,我这里介绍常用的解决方案,编辑环境变量LUA_PATH
    在当前用户根目录下打开 .profile 文件(没有则创建,打开 .bashrc 文件也可以),
    例如把 "~/lua/" 路径加入 LUA_PATH 环境变量里:

    #LUA_PATH
    export LUA_PATH="/usr/local/lua/?.lua;;"

    文件路径以 ";" 号分隔,最后的 2 个 ";;" 表示新加的路径后面加上原来的默认路径。

    接着,更新环境变量参数,使之立即生效。

    source ~/.profile

    这时假设 package.path 的值是:

    /usr/local/lua/?.lua;./?.lua;/usr/local/openresty/luajit/share/luajit-2.1.0-beta3/?.lua;/usr/local/share/lua/5.1/?.lua;/usr/local/share/lua/5.1/?/init.lua;/usr/local/openresty/luajit/share/lua/5.1/?.lua;/usr/local/openresty/luajit/share/lua/5.1/?/init.lua

    那么调用 require("model") 时就会尝试打开以下文件目录去搜索目标。

  • 相关阅读:
    Js常用的函数
    数组和集合的相互转换
    Java中的volatile的作用和synchronized作用
    mac下使用mysql控制台命令行
    几种优化ajax的执行速度的方法
    解决Macbook网络连接成功但是图标一直显示正在查找网络问题
    Android Stdio 中的Rendering Problems Android N requires the IDE to be running with Java 1.8 or later Install a supported JDK解决办法
    Activiti 中的ACT_RU_TASK表中的EXECUTION_ID和PROC_INST_ID区别
    Ibatis学习总结2--SQL Map XML 配置文件
    Ibatis学习总结1--ibatis简介和SQL Maps
  • 原文地址:https://www.cnblogs.com/reblue520/p/11433805.html
Copyright © 2020-2023  润新知