lua 中的上n级模块路径函数分享

在lua开发中使用模块并非难事也非易事,其中关于lua文件定位就不太直接方便。

比如有如下文件结构:

假设 me 是正在开发的模块。而由于 lua 中的 require 函数使用的相对于 lua 解释器的路径,同时 lua 也没有 ../ 这样的上一级文件的写法,所以如果 ti/me/pk/folder.lua 想要调用 ti/me/na 模块的话就必须写成出完整的路径出来。即floder.lua 中的调用语句就是 require (“ti.me.na”) 。

但是如果me模块不是在 ti 文件下,当别人使用时是放在 xx/xxx 文件夹下的话这样写就不对了。所以在floder.lua文件中做一些处理保证调用文件的正确性。

这里就要用到 lua 中的 … 了, 在 lua 中的 … 表示可变参数,而 … 在lua文件域中(不是在函数里出现的 …)表示当前模块的位置。例如folder.lua 中的… 是 “ti.me.pk.folder” 。注意 init.lua 中的 … 表示 “ti.me.na”,因为这个模块是 ti.me.na 而不是 ti.me.na.init。

所以当 folder.lua 用 require 调用 ti/me/na 时需要先利用 … (在folder.lua 中表示”ti.me.pk.folder”) 找到 “ti.me”(向上两级) 然后连接字符串 “.na”(向下一级)。关键就是生成向上n级的模块路径,所以我们写出了如下的向上n级的辅助函数:

--- 得到 lua 模块路径的上 n 级,返回的的字符串结尾有个 "." 字符
-- @usage getUpFloder("math.base.core", 2) --将返回 "math."
-- @string 想要处理的模块路径字符串
-- @int 向上 n 级,可选参数,默认为 1
local function getUpFloder(path, n)
    -- 错误检查
    path = path or ""
    n = n or 1
    assert(type(path) == "string", "传入的参数不是字符串类型!")

    -- 找到文件夹的每一级
    local path_part = {}
    for w in string.gmatch(path, "%.?[^%.]+") do
        path_part[#path_part + 1] = w
    end

    -- 生成需要的部分
    local new_path = ""
    for i = 1, #path_part - n do
        new_path = new_path .. path_part[i]
    end

    -- 返回
    return new_path .. "."
end

在folder.lua这样写就可以得到na的模块路径了:

欢迎指错,当然,如果你有更好的方法也请@我告诉我!

时间: 2024-08-02 22:25:59

lua 中的上n级模块路径函数分享的相关文章

Lua中的函数

[前言] Lua中的函数和C++中的函数的含义是一致的,Lua中的函数格式如下: function MyFunc(param) -- Do something end 在调用函数时,也需要将对应的参数放在一对圆括号中,即使调用函数时没有参数,也必须写出一对空括号.对于这个规则只有一种特殊的例外情况:一个函数若只有一个参数,并且此参数是一个字符串或table构造式,那么圆括号便可以省略掉.看以下代码: print "Hello World" --> print("Hell

Lua中的模块(module)和包(package)详解1

这篇文章主要介绍了Lua中的模块(module)和包(package)详解,本文讲解了require函数.写一个模块.package.loaded.module函数等内容,需要的朋友可以参考下 前言 从Lua5.1版本开始,就对模块和包添加了新的支持,可是使用require和module来定义和使用模块和包.require用于使用模块,module用于创建模块.简单的说,一个模块就是一个程序库,可以通过require来加载.然后便得到了一个全局变量,表示一个table.这个table就像是一个命

Lua语言基础汇总(11) -- Lua中的模块与包

前言 从Lua5.1版本开始,就对模块和包添加了新的支持,可是使用require和module来定义和使用模块和包.require用于使用模块,module用于创建模块.简单的说,一个模块就是一个程序库,可以通过require来加载.然后便得到了一个全局变量,表示一个table.这个table就像是一个命名空间,其内容就是模块中导出的所有东西,比如函数和常量,一个符合规范的模块还应使require返回这个table.现在就来具体的总结一下require和module这两个函数. require函

Lua中的模块(module)和包(package)详解

这篇文章主要介绍了Lua中的模块(module)和包(package)详解,本文讲解了require函数.写一个模块.package.loaded.module函数等内容,需要的朋友可以参考下 前言 从Lua5.1版本开始,就对模块和包添加了新的支持,可是使用require和module来定义和使用模块和包.require用于使用模块,module用于创建模块.简单的说,一个模块就是一个程序库,可以通过require来加载.然后便得到了一个全局变量,表示一个table.这个table就像是一个命

Lua中的模块以及实现方法

从使用的角度来看,一个模块就是一个程序库,可以通过Lua自身提供的require来加载.然后便得到一个全局变量,表示一个table.这个table就是像一个名字空间,其内容就是模块导出的所有东西,例如函数和常量.简单的说,Lua中的模块就是一个table,table中可以包括任何东西.本文首先详细介绍模块相关的require函数,包括该函数的执行流程以及查找模块的路径,然后介绍了实现模块的三种方法,并给出相应的优缺点. require函数 该函数用来加载一个模块,即按指定的路径和传入的参数,查找

Lua中的模块与module函数详解

很快就要开始介绍Lua里的“面向对象”了,在此之前,我们先来了解一下Lua的模块. 1.编写一个简单的模块 Lua的模块是什么东西呢?通常我们可以理解为是一个table,这个table里有一些变量.一些函数… 等等,这不就是我们所熟悉的类吗? 没错,和类很像(实际上我说不出它们的区别). 我们来看看一个简单的模块,新建一个文件,命名为game.lua,代码如下: 复制代码代码如下: game = {}function game.play()    print("那么,开始吧");end

在eclipse中发布maven的多模块web项目到tomcat上及单步debug模块jar

1.在eclipse中发布maven的多模块web项目到tomcat eclipse和maven及tomcat的部署略去,还有maven的基础知识和使用在此处略去. 按照如下的步骤操作: 将lib和maven模块生成的jar加入到lib下. 注意:到这步可能有WebContent并且没有src/main/webapp,要做如下操作 1.选中 WebContent,remove掉它 2.新建一个,Source文件夹为src/main/webapp,deploy path为 / 至此,后面可以用正常

Django中常用的那些模块路径

Django中常用的那些模块路径 from django.shortcuts import HttpResponse, render, redirect from django import template from django.conf.urls import url from django.urls import path from app01 import views from django.conf.urls import include, url from django.urls

在eclipse中公布maven的多模块web项目到tomcat上及单步debug模块jar

1.在eclipse中公布maven的多模块web项目到tomcat eclipse和maven及tomcat的部署略去,还有maven的基础知识和使用在此处略去. 依照例如以下的步骤操作: 将lib和maven模块生成的jar增加到lib下. 注意:到这步可能有WebContent而且没有src/main/webapp,要做例如以下操作 1.选中 WebContent,remove掉它 2.新建一个,Source目录为src/main/webapp,deploy path为 / 至此,后面能够