函数/变量作用域(按值传递还是引用传递?) [英] Function/variable scope (pass by value or reference?)

查看:25
本文介绍了函数/变量作用域(按值传递还是引用传递?)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我完全被 Lua 的变量作用域和函数参数传递(值或引用)搞糊涂了.

I'm completely confused by Lua's variable scoping and function argument passing (value or reference).

查看下面的代码:

local a = 9        -- since it's define local, should not have func scope
local t = {4,6}    -- since it's define local, should not have func scope

function moda(a)
  a = 10           -- creates a global var?
end
function modt(t)
  t[1] = 7         -- create a global var?
  t[2] = 8
end

moda(a)
modt(t)
print(a)  -- print 9 (function does not modify the parent variable)
print(t[1]..t[2])  -- print 78 (some how modt is modifying the parent t var) 

因此,这种行为完全让我感到困惑.

As such, this behavior completely confuses me.

  • 这是否意味着表变量被传递给函数参考而不是价值?

  • Does this mean that table variables are passed to the function by reference and not value?

全局变量是如何创建的与已经定义的冲突局部变量?

How is the global variable creation conflicting with the already define local variable?

  • 为什么 modt 能够修改表格但 moda 无法修改a变量?
  • Why is modt able to modify the table yet moda is not able to modify the a variable?

推荐答案

你猜对了,表变量是通过引用传递的.引用 Lua 5.1 参考手册:

You guessed right, table variables are passed by reference. Citing Lua 5.1 Reference Manual:

Lua 有八种基本类型:nil、boolean、number、string、function、userdata、thread 和 table.....

There are eight basic types in Lua: nil, boolean, number, string, function, userdata, thread, and table. ....

表、函数、线程​​和(完整的)用户数据值都是对象:变量实际上不包含这些值,只包含对它们的引用.赋值、参数传递和函数返回总是操纵对这些值的引用;这些操作并不意味着任何形式的复制.

Tables, functions, threads, and (full) userdata values are objects: variables do not actually contain these values, only references to them. Assignment, parameter passing, and function returns always manipulate references to such values; these operations do not imply any kind of copy.

所以 nil、布尔值、数字和字符串都是按值传递的.这完全解释了您观察到的行为.

So nil, booleans, numbers and strings are passed by value. This exactly explains the behavior you observe.

这篇关于函数/变量作用域(按值传递还是引用传递?)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆