在Lua中参数应该用作变量吗?
Java告诉我应该避免修改原始参数,例如在Lua中参数应该用作变量吗?,lua,convention,Lua,Convention,Java告诉我应该避免修改原始参数,例如 public int doStuff(int begin, int end) { /* loop or something */ begin++; //bad end--; //also bad /* end loop */ return } 相反,我应该这样做 public int doStuff(int begin, int end) { int myBegin = begin; //something like this
public int doStuff(int begin, int end) {
/* loop or something */
begin++; //bad
end--; //also bad
/* end loop */
return
}
相反,我应该这样做
public int doStuff(int begin, int end) {
int myBegin = begin; //something like this
int myEnd = end;
/* stuff */
return
}
所以,我一直在卢阿做这件事
function do_stuff(begin, last)
local my_begin = begin
local my_last = last
--stuff
my_begin = my_begin + 1
my_last = my_last - 1
--stuff
end
但是,我想知道
function do_stuff(begin, last)
--stuff
begin = begin + 1
last = last - 1
--stuff
end
也不鼓励这样做,还是说这样做既美观又简洁?如果你被告知不要修改函数的参数,那么可能有一种与此相关的推理。无论这种推理是什么,都将同样适用于Lua和Java,因为它们具有相似的函数参数语义。这些原因可能是一个或多个(但不限于):
- 如果修改参数。。。你再也没有了。如果您突然需要传递的原始值,它现在就不存在了
- 造成混淆,具体取决于参数的命名方式。单词“begin”表示某事的开始。如果你改变了它,它就不一定是开始,而仅仅是你正在操作的当前元素
- 如果处理引用类型(Java中的非基本类型、Lua中的表等),则会产生潜在错误。当你修改一个对象时,你正在为每个人修改它。而增加一个整数只会改变你的局部值。因此,如果您经常修改参数,您仍然需要考虑哪些参数应该戳,哪些参数不应该戳
换句话说,如果您同意在Java中这样做的建议,那么它同样适用于Lua。如果您不同意Java中的建议,那么您就没有更多的理由在Lua下遵循它。没有规则。让品味、清晰度和需求来决定 尽管如此,一个常见的习惯用法是为参数提供默认值,如中所示
function log(x,b)
b = b or 10
...
end
在Lua函数中,线程、表和用户数据类型通过引用传递。因此,除非你有其中一个,否则你无论如何都在使用本地副本 在你的例子中:
function do_stuff(begin, last)
--stuff
begin = begin + 1
last = last - 1
--stuff
end
begin
和last
是do\u stuff
范围内的本地非参考变量
复制它们的唯一原因是,您可能希望将初始值存储在那里,以供以后使用。为此,您可以创建初始值的备份副本,也可以创建初始值的工作副本。你喜欢什么都行
只需确保你知道什么是通过引用传递的,什么是通过值传递的,这样你就可以避免改变你不想改变的东西,反之亦然。这很好,很简洁,“如果你改变了它,它就不一定是开始了”:真的!我几乎在任何地方都避免使用可替换的概念。如果您更改变量的值,如果一开始就正确命名,那么它的名称应该变成谎言。但是,对于参数,立即、简短、合理的“修复”,如@lhf建议的默认值,可能会很有用。在历史CS术语中,所有Lua参数都是“On”传递的。变量不能作为实际参数引用。(从语法上讲,无论多么简单,实际参数始终是表达式,并且表达式不能被赋予新值。)