如果变量是一个参数,则无法在函数中更改该变量。
2015-12-20 16:9:39
收藏:0
阅读:93
评论:2
将下面内容翻译成中文只显示翻译内容,保留原本的 markdown 格式
function bar(w)
w = 1
end
a = 2
bar(a)
print(a) -- => 2
下面的例子可以工作,但它不是一个参数。
function test()
a = 1
end
a = 2
test(a)
print(a) -- => 1
如果变量是一个参数,如何在函数体内更改这个变量?
点赞
用户3979429
在 Lua 中,大多数值都是通过值传递的。这意味着当你将它们传递给函数时,你的函数只会得到一个副本。这包括字符串、数字、nil和布尔类型。但有两种其他的数据类型(不包括用户数据)。
它们是表和函数。
它们是通过引用传递的。这意味着,你可以编辑这两种数据类型,它将是“永久”的,因为你有对原始值的引用。
让我们从表开始。如果我们在函数中传递一个表,在函数内部,你可以编辑表的属性:
function Change(x)
x.val = 5
end
a = {val=2}
Change(a)
print(a.val)
现在这很琐碎,所以我不打算解释它是如何工作的。
接下来我们用一个函数。但是...怎么做?你怎么能“编辑”一个函数?
你看,函数有这些奇妙的东西叫做“upvalues”。它是它作用域之外的本地值,所以我们可以编写一个简单的 get / set 函数,如下所示:
function Change(x)
x("set", 5)
end
do
local val = 2
function a(method, v)
if method == "set" then
val = v
elseif method == "get" then
return val
end
end
end
Change(a)
print(a("get"))
当你使用 set 调用 a 时,它会给出作用域之外的本地变量(它在作用域之外,因此它不会在每次调用时重置)一个新值。而get会返回它的值。
但如果这不实用怎么办。如果你想要修改全局变量,你可以使用_G。不是传递值本身,而是将变量作为字符串传递。这将允许我们索引变量。和使用引用传递一样好,缺点是它不适用于本地变量。
function Change(x)
_G[x] = 5
end
a = 2
Change('a')
print(a)
我希望我的回答对你有帮助!
2015-12-20 17:38:33
评论区的留言会收到邮件通知哦~
推荐文章
- Lua 虚拟机加密load(string.dump(function)) 后执行失败问题如何解决
- 我想创建一个 Nginx 规则,禁止访问
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在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 代码?

如数字 Veer 在评论中提到,lua 值一般通过值传递。所以你不能这样做。
然而,表是通过引用传递的。(更多关于此的讨论请参见 lua 手册中的 2.2 值和类型 章节。)
所以如果你将一个表传递给函数,你可以修改表内的值。
function bar(tab) tab.w = 1 end local t = {w = 2} bar(t) print(t.w) -- => 1