loadstring中怎么动态加载模块

  介绍

今天就跟大家聊聊有关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中怎么动态加载模块