介绍
今天就跟大家聊聊有关loadstring中怎么动态加载模块,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。
先来看一段片段:
,,,小姐:=32 ,,,local 小姐:=0 ,,,f =, loadstring(“小姐:=,小姐:+,1;,打印(i),),,,,,,,,,,,,,,,,, ,,,g =, function (),小姐:=,小姐:+,1;,打印(i),最终获得,,,,,,,,,,,,,, ,,,f(),——在33 ,,,g(),——在1 ,,,h =, function (), _G.i =, _G.i +, 1;打印(_G.i),结束 ,,,h(),——在34 之前结束> 引用>f()输出33 g()输出1。原因是第一个我是全局变量,第二个我是当地变量,而同名的地方变量总是覆盖掉全局变量.loadstring产生的函数只能看到全局变量,因此f()输出33。如果想让g()函数访问全局变量我可以利用全局环境变量_G,所以h()就返回了34。
因此如果要使用loadstring从字符串动态加载Lua代码的话,也不应使用Lua全局变量来存放加载后的Lua代码块,而应该当作Lua模块来进行处理,比如下面这个例子:
local lua_src =, [[ ,,,local _M =, {} ,,,local say =ngx.say ,,,function _M.run () ,,,,,,,说(“hello world") ,才能结束 ,,,return _M ]] local f, err =, loadstring (lua_src,“module foo") if not  f 然后 ,,,ngx.say (“failed 用load 模块:,,,,呃) ,才能返回 结束 local mod =, f () if not  mod 然后 ,,,ngx.say (“Lua  source does not return 从而module") ,才能返回 结束 package.loaded.foo =,国防部这相当于我们从内存(一个Lua字符串)直接加载了一个名为foo的Lua模块,然后每当要调用这片代码时,我们可以像使用模块一样:
local foo =, require “foo" foo.run ()引用>看完上述内容,你们对loadstring中怎么动态加载模块有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注行业资讯频道,感谢大家的支持。
loadstring中怎么动态加载模块