dofile 和 require 不像我预期的那样工作

我想加载一些lua文件,然后把它粘贴到我的代码中间。

比如:

do
local abc = 123
dofile "somecode.lua"
end

而 somecode.lua 文件则是:

if abc == 123
print("hello") end

我期望通过这些代码和文件来实现以下目标:

do
local abc = 123
if abc == 123
print("hello") end
end

输出:hello

但是真实的输出什么都没有,因为 'local' 声明对dofile函数没有影响。

我想知道有没有一种方法可以像上面那样将代码插入到代码中间并按照我期望的那样工作。是否有符合我的需求的函数?

点赞
用户1091784
用户1091784

首先,你的代码存在一些语法问题。

somecode.lua文件必须像下面这样:

if abc == 123 then
    print("hello")
end

需要注意的是,我们使用了 == 进行比较,并且加入了 then

至于你的问题,即 hello 没有被打印出来,原因是 abc 变量被声明为 local,因此在 if 语句中使用的 abc 变量并不是指局部的 abc,而是默认的全局 abc。为了解决这个问题,你必须在文件中初始化一个全局的 abc,这样 somecode.lua 文件也会使用同一个变量。

像这样:

$ cat file1.lua
do
    abc = 123
    dofile "somecode.lua"
end
$ cat somecode.lua
if abc == 123 then
    print("hello")
end
$ lua file1.lua
hello
2018-02-28 15:53:25
用户3574628
用户3574628

一个 Lua 文件本质上是一个函数。它可以有一个 return 语句,但它不能有参数。为了保持所有变量局部化,somecode.lua 应该返回一个函数。

somecode.lua:

return function(abc)
  if abc == 123 then
    print("hello")
  end
end

其他文件:

dofile "somecode.lua"(123)
2018-03-04 10:42:03