Lua 'require' 复制表格

我想做的是使用模块创建两个不同且分离的表格,但实际上发生的是,如果我已经使用了'require',那么它将给我一个对之前'require'的引用,但我真正想要的只是模块的值/拷贝。我不能使用'dofile',因为 1)我需要使用相对路径,2)我正在为 Android 上的 Corona 构建它,而我了解到'dofile'不能很好地与.apk配合使用。

这是我的代码。

这是我的 main.lua

foo = require('modules.myModule')
bar = require('modules.myModule')

bar:changeName()

assert(foo.name ~= bar.name)

这是在%cd%/modules/myModule中的代码

local M = {
    name = "hai",
    changeName = function(self)
        self.name = 'not_hai'
    end
}
return M
点赞
用户1847592
用户1847592

你的模板可以返回 M 的构造函数,而不是 M


你的模板:

return
   function()  -- 这是一个 M 的构造函数
      local M = {
         name = "hai",
         changeName = function(self)
            self.name = 'not_hai'
         end
      }
      return M
   end

你的主要脚本:

foo = require('modules.myModule')()
bar = require('modules.myModule')()

bar:changeName()

assert(foo.name ~= bar.name)
2017-04-03 20:28:06
用户7504558
用户7504558

作为变体,您可以使用这个 unrequire 函数:

function unrequire(m)
    package.loaded[m] = nil
    _G[m] = nil
end

foo = require('myModule')
unrequire('myModule')
bar = require('myModule')

myModule 模块加载到 foo 中后,使用 unrequire 函数取消加载,并将 _G 表中对应的键值对也删除,然后再次尝试使用 require 加载 myModule,将不会从缓存中加载,因为它已经被删除了。

2017-04-03 20:34:35
用户7026995
用户7026995

这是一个模块写法

local M = {}

function M.new()
  local myTable = { name = "hai" }

  myTable:changeName ()
    self.name = 'not_hai'
  end

  return myTable
end

return M

用法:

local m = require('myModule')

foo = m.new()
bar = m.new()

bar:changeName()
2017-04-04 08:28:28