使用全局“local”的Lua“require”?
很显然我有点混淆,但我认为通过在 "main.lua" 中使用这样的东西:
local module = require("module")
local var = "I should be global?"
printthis()
其中 module.lua 包含以下内容:
function printthis()
print(var)
end
printthis(var)
应该工作正常,因为现在 module.lua 代码在 main.lua 中,对吗? 然而,printthis 不知道 var
是什么。我读过在可能的情况下使用 "local" 在 Lua 变量上是一种良好的做法,但在这种情况下,我必须将 var
设置为全局变量,还是 module.lua 的 printthis()
函数有一种方法来正确读取 var
?
原文链接 https://stackoverflow.com/questions/6586145
不,这不是它的工作原理。
Lua 解释器提供了一个全局表,通常称为 _G,除非你在做一些奇怪的事情。
function printthis()
print(var)
end
实际上,这意味着
_G.printthis = function()
_G.print(_G.var);
end
并且你在主要代码中的代码等同于
local module = _G.require("module")
local var = "I should be global?"
_G.printthis()
但是当你调用 printthis
时,_G.var
在哪里设置了呢?没有设置。因此,该变量是 nil,就像访问表中没有该键的所有访问一样。
这可能很不方便,但从长远来看,通过传递参数而不是设置全局变量要好得多。一旦你来改变程序的任何内容,就完全不可能进行任何更改,因为逻辑没有结构,你不知道发生了什么,除非阅读每一行代码并立即理解它。此外,你只能在一个地方使用每个键,因为它是全局表。所以我希望没有人希望使用 "var" 作为变量名,并且你不介意你的代码默默地失败,因为你错误地使用了一个全局名称。
另外两个答案忽略了一个重要的问题:词法作用域。
大致意思是,代码可以访问在定义代码的地方定义的局部变量。这可能听起来很模糊,所以我会举个例子:
local cheese = 'sandwich'
print(cheese) -- 输出sandwich
do -- 这开始了一个匿名块
local cheese = 22
print(cheese) -- 输出22
end
print(cheese) -- 输出sandwich
所以我们这里有两个不同的变量:外部的变量被内部的变量"遮盖"了。
现在,转到函数:
do
local hotdog = 'hot'
function nonsense()
print(hotdog)
end
end
print(hotdog) -- 输出nil,因为这里没有叫hotdog的变量
nonsense() -- 输出hot
函数可以从它们被_定义_的地方看到局部变量,而不是从它们被调用的地方。一旦你掌握了它,这非常重要而且非常有用。
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
- 如何编写 Lua 模式将字符串(嵌套数组)转换为真正的数组?
我不是 Lua 的专家,但是
var
不应该作为变量传递吗?类似这样的:function printthis(var) print(var) end
你在函数头中缺少了
var
,并且你将在main.lua
中的var
作为参数传递给printthis()
函数。