【问题标题】:lua 'require' duplicating tablelua 'require' 复制表
【发布时间】:2017-08-28 19:32:24
【问题描述】:

我想做的是;使用模块创建两个不同且单独的表,但似乎正在发生的是;如果我已经使用过 'require',那么它将给我一个对上一个 require 的引用,我真正想要的只是模块的值/副本。我不能使用“dofile”,因为 1)。我需要使用相对路径和 2)。我正在 Corona 中为 android 构建它,据我所知,“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

【问题讨论】:

    标签: module lua reference require


    【解决方案1】:

    您的模块可以返回M 的构造函数,而不是M


    你的模块:

    return 
       function()  -- this is a constructor of 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)
    

    【讨论】:

      【解决方案2】:

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

      function unrequire(m)
          package.loaded[m] = nil
          _G[m] = nil
      end
      
      foo = require('myModule')
      unrequire('myModule')
      bar = require('myModule')
      

      【讨论】:

        【解决方案3】:

        这是我写模块的方式

        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()
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-09-21
          • 2014-06-11
          • 1970-01-01
          • 1970-01-01
          • 2013-04-06
          • 2013-05-16
          • 2014-03-15
          • 2023-04-07
          相关资源
          最近更新 更多