lua关于require和package.loaded常被忽略的故事

用require函数只能加载一次,因为它的特性是:

1、require函数会搜索目录加载文件

2、require会判断是否文件已经加载避免重复加载同一文件。

而这个特性二,虽然我们可能知道这两个特性,但是潜意识里面常常把这个特性二给忽视掉了.

直到哪天我们需要反复加载同一个lua文件,但是没有实现自己想要效果的时候,才会发现这个特性二的存在感特别强!

也许有的小伙伴,会有疑问,为什么要反复加载啊?加载一次不就能用了么?

当我有一些特殊的需求的时候,就可能会需要反复加载某个lua文件,例如我的文件lua文件动态地改变了,或者一些其他特殊原因.

那么,如何实现反复加载一个lua文件?

答案是:二次加载前加这一句package.loaded[luafile] = nil就ok了

例如我们需要反复地required(‘test.lua’),那么第二次加载时的代码如下:

package.loaded[‘test.lua’] = nil

required(‘test.lua’)

参考资料:

http://baike.baidu.com/view/8751804.htm?fr=aladdin 关于required函数的特性

http://www.cnblogs.com/Wilson-Loo/p/3301989.html  Lua
脚本重启 机制

http://7301766.blog.163.com/blog/static/144633559201101904135456/    LUA modue require package 区别

时间: 2024-10-15 19:38:32

lua关于require和package.loaded常被忽略的故事的相关文章

Lua的require和module小结

Lua的require和module小结  module特性是lua5.1中新增的,用于设置Lua文件自己的模块,最常用的方式是module(name,package.seeall),有时候lua文件名和module设置的名字不一样,到底require的时候该 require文件名还是require模块(module)名了,今天自己试了一把  首先,如果在lua文件中不显示的require,那么lua运行环境会默认加载哪些呢? 可以通过遍历package.loaded数组来查看,包括以下  st

Lua的require机制

在Lua中,有模块这个定义,加载一个模块需要使用require函数,require是一个全局函数. require有两个写法require("modname")和require "modname" 1.首先require函数会查找package.loaded表,检测modname是否加载过,如果加载过,则不再加载,如果没加载过,则继续 2.require加载模块的按照package.searchers序列的指引来查找加载器,使用另一个全局函数loader()实现,P

[转]关于event的两个常被忽略的api:isDefaultPrevented()和preventDefault()

今天在robert penner(as3 singal的作者)的一篇blog文中顺藤摸瓜到了darron schall的另外一篇blog文(Creating Default, Cancelable Event Handlers),仔细看了一下,忽然有种相见恨晚的感觉. 确实是啊~rober penner的singal我不是第一天就知道了,之后再arpg的demo里面也有用过,只可惜今天才认真看了一下penner的这篇文章,也很可惜在schall发布这个文章的两年后才看到,真遗憾 好了,下面来谈谈

学习JavaScript之parseInt()数值转换常被忽略的问题

使用parseInt()你可以从字符串中获取数值,该方法接受另一个基数参数,这经常省略,但不应该.当字符串以”0″开头的时候就有可能会出问题,例如,部分时间进入表单域,在ECMAScript 3中,开头为”0″的字符串被当做8进制处理了,但这已在ECMAScript 5中改变了.为了避免矛盾和意外的结果,总是指定基数参数. var month = "06", year = "09"; month = parseInt(month, 10); year = parse

HTML 5学习笔记1——那些常被忽略的属性

之前学习HTML5的时候,心态比较浮躁,现在安下心来再仔细看HTML5,真的有很多比较好的属性常常被忽略,起码我是很少用到的. 1. accesskey,支持的标签有<a> <area> <button> <input> <textarea> <label> <lagend>(表单标签 以及链接标签),除了Opera外其他浏览器均支持. 使用的时候用Alt + accessKey (或者 Shift + Alt +acce

php需要用到常被忽略的方法

在PHP删除数组中空值的方法介绍 foreach循环的效率不高,消耗太大 array_filter(array,function) 例子 <?php function myfunction($v)  { if ($v==="Horse") { return true; } return false; } $a=array(0=>"Dog",1=>"Cat",2=>"Horse"); print_r(ar

Lua 学习之基础篇七&lt;Lua Module,Package介绍&gt;

Lua 之Module介绍 包管理库提供了从 Lua 中加载模块的基础库. 只有一个导出函数直接放在全局环境中: [require]. 所有其它的部分都导出在表 package 中. require (modname) 加载一个模块. 这个函数首先查找 [package.loaded] 表, 检测 modname 是否被加载过. 如果被加载过,require 返回 package.loaded[modname] 中保存的值. 否则,它会为模块寻找加载器. require 遵循 [package.

Chapter 15_1 require函数

Lua提供了一个名为require的高层函数来加载模块,但这个函数只假设了关于模块的基本概念. 对于require而言,一个模块就是一段定义了一些值(函数或者包含函数的table)的代码. 为了加载一个模块,只需要简单调用require "modname" .这个函数首先会查找package.loaded表,检查modname是否加载过. 如果加载过,require返回package.loaded[modname]中的值. 否则,它试着为模块寻找“加载器”. 首先require会搜寻L

lua require与module

一.模块机制module 1.什么是module 对于用户来说,一个module相当于一个so库.模块的主要目标是实现代码的共享. 2.如何编写module lua是通过table来实现模块的,典型的写法如下. local M = {}        ---- 通常是加local的,如果不加,则M默认注册到_G中,require后,即使不return也可以直接使用M.加了local是局部变量,需要显示的return一下. M.print = function(...) print(...) en