Tencent / UnLua

A feature-rich, easy-learning and highly optimized Lua scripting plugin for UE.
Other
2.25k stars 615 forks source link

反馈一个 HotReload.lua 中 require 函数的问题 #653

Open GotGimhong opened 1 year ago

GotGimhong commented 1 year ago

HotReload.lua 重写了 require 函数。按照目前的实现,如果在 Lua 代码的末尾没有任何返回,那么被 require 过的 Lua 代码并不会被记录到 loaded_modulepackage.loaded 当中,因为这里的临时变量 new_module 始终是 nilUnLua反馈

举个例子:

-- Script/MyGlobalTable.lua
MyGlobalTable = MyGlobalTable or {}
-- ...

如果使用重写后的 require 函数,那么每次 require 这个文件时都会重新执行一次里面的代码。但是按照 Lua 原来的 require 函数的实现,require 过一次后,package.loaded["MyGlobalTable"] 会被设置成 true,之后即使重复 require,也不会重复执行文件里的代码。

因此想请问一下这样实现的原因,是出于某种考虑还是单纯写错了。

jozhn commented 1 year ago

你记错了,Lua本身就是只有文件末尾return table的时候才会记录在package.loaded里面

GotGimhong commented 1 year ago

你记错了,Lua本身就是只有文件末尾return table的时候才会记录在package.loaded里面

文件末尾有 return table 的时候当然会把这个 table 记录在 package.loaded 里面。我的意思是,当文件末尾没有 return table 时,package.loaded 里面也会对应记录一个 true,表示加载过这个文件,这个是 Lua 本身的设计,具体可以看 Lua 源码 loadlib.c 里面,ll_require 函数的实现,以下是 Lua 5.4.4 的实现,在旧版本中也有这种设计。 lua544_loadlib_c

jozhn commented 1 year ago

哦,是我记错了。。。你说得对