Lua require 相对路径

Lua中的路径系统和我们熟知的路径系统是不一样的。 
当我们随便的输入一个不存在文件的名,如下面的代码一样

 require("lib.lua")
  • 1

就会出现以下的报错的信息

no field package.preload['lib.lua']
    no file 'D:\Lua\LuaProject\my_first_Lua\src\lib\lua.lua'
    no file 'D:\Lua\LuaProject\my_first_Lua\src\lib\lua\init.lua'
    no file 'D:\Lua\LuaProject\my_first_Lua\src\lib\lua.luac'
    no file 'D:\Lua\LuaProject\my_first_Lua\src\lib\lua\init.luac'
    no file '.\lib\lua.lua'
    no file 'C:\Program Files\Java\jre1.8.0_66\bin\lua\lib\lua.lua'
    no file 'C:\Program Files\Java\jre1.8.0_66\bin\lua\lib\lua\init.lua'
    no file 'C:\Program Files\Java\jre1.8.0_66\bin\lib\lua.lua'
    no file 'C:\Program Files\Java\jre1.8.0_66\bin\lib\lua\init.lua'
    no file 'D:\Lua\5.1\lua\lib\lua.luac'
    no file '.\lib\lua.lua'
    no file 'C:\Program Files\Java\jre1.8.0_66\bin\lua\lib\lua.lua'
    no file 'C:\Program Files\Java\jre1.8.0_66\bin\lua\lib\lua\init.lua'
    no file 'C:\Program Files\Java\jre1.8.0_66\bin\lib\lua.lua'
    no file 'C:\Program Files\Java\jre1.8.0_66\bin\lib\lua\init.lua'
    no file 'D:\Lua\LuaForWindow\5.1\lua\lib\lua.luac'
    no file '.\lib\lua.dll'
    no file '.\lib\lua51.dll'
    no file 'C:\Program Files\Java\jre1.8.0_66\bin\lib\lua.dll'
    no file 'C:\Program Files\Java\jre1.8.0_66\bin\lib\lua51.dll'
    no file 'C:\Program Files\Java\jre1.8.0_66\bin\clibs\lib\lua.dll'
    no file 'C:\Program Files\Java\jre1.8.0_66\bin\clibs\lib\lua51.dll'
    no file 'C:\Program Files\Java\jre1.8.0_66\bin\loadall.dll'
    no file 'C:\Program Files\Java\jre1.8.0_66\bin\clibs\loadall.dll'
    no file '.\lib.dll'
    no file '.\lib51.dll'
    no file 'C:\Program Files\Java\jre1.8.0_66\bin\lib.dll'
    no file 'C:\Program Files\Java\jre1.8.0_66\bin\lib51.dll'
    no file 'C:\Program Files\Java\jre1.8.0_66\bin\clibs\lib.dll'
    no file 'C:\Program Files\Java\jre1.8.0_66\bin\clibs\lib51.dll'
    no file 'C:\Program Files\Java\jre1.8.0_66\bin\loadall.dll'
    no file 'C:\Program Files\Java\jre1.8.0_66\bin\clibs\loadall.dll'
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33

那么为什么lua require方法搜索一个模块或者文件的流程会依次搜索文件名为lib.lua的文件或者dll?这是因为lua的模块路径是存在一个全局table package的path和cpath字段里的:

print(package.path);
print(package.cpath);
  • 1
  • 2

执行上面的代码,我们将会得到下面的结果。

D:\Lua\LuaProject\my_first_Lua\src\?.lua;
D:\Lua\LuaProject\my_first_Lua\src\?\init.lua;
D:\Lua\LuaProject\my_first_Lua\src\?.luac
;
D:\Lua\LuaProject\my_first_Lua\src\?\init.luac;.\?.lua;
C:\Program Files\Java\jre1.8.0_66\bin\lua\?.lua;C:\Program Files\Java\jre1.8.0_66\bin\lua\?\init.lua;C:\Program Files\Java\jre1.8.0_66\bin\?.lua;
C:\Program Files\Java\jre1.8.0_66\bin\?\init.lua;;D:\Lua\5.1\lua\?.luac;.\?.lua;
C:\Program Files\Java\jre1.8.0_66\bin\lua\?.lua;
C:\Program Files\Java\jre1.8.0_66\bin\lua\?\init.lua;
C:\Program Files\Java\jre1.8.0_66\bin\?.lua;
C:\Program Files\Java\jre1.8.0_66\bin\?\init.lua;;
D:\Lua\LuaForWindow\5.1\lua\?.luac
.\?.dll;.\?51.dll;
C:\Program Files\Java\jre1.8.0_66\bin\?.dll;
C:\Program Files\Java\jre1.8.0_66\bin\?51.dll;
C:\Program Files\Java\jre1.8.0_66\bin\clibs\?.dll;
C:\Program Files\Java\jre1.8.0_66\bin\clibs\?51.dll;
C:\Program Files\Java\jre1.8.0_66\bin\loadall.dll;
C:\Program Files\Java\jre1.8.0_66\bin\clibs\loadall.dll
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

我们会发现一个问题,就是很多路径中含有“?”,这是因为当require的时候lua解释器会按照path 和cpath里存储的路径替换“?”去查询是否存在该文件,有则加载脚本或者模块亦或是C库。

如果我要加载一个文件 
这里写图片描述 
在这工程中,我是让Demo1加载lib文件的。 
我们需要

package.path = package.path ..';..\\?.lua';
require("Lua2.lib");
  • 1
  • 2

完整的项目是: 
Demo1.lua中的代码是

 package.path = package.path ..';..\\?.lua';
 require("Lua2.lib");
n = norm(3,4)
print(twice(n))
  • 1
  • 2
  • 3
  • 4

lib.lua中的代码是

function norm(x,y)
  local n2 = x^2 + y^2
  return math.sqrt(n2)
end

function twice(x)
  return 3 * x
end
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

如有瑕疵,多多指教。本人QQ:763496668

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值