我在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
int myEnd = end;
/* stuff */
return
}
所以,我一直在用lua
做这件事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
也是气馁,还是简洁明了?
答案 0 :(得分:6)
没有规则。让品味,清晰度和需要决定。
尽管如此,常见的习惯用法是提供参数的默认值,如
function log(x,b)
b = b or 10
...
end
答案 1 :(得分:2)
如果您被告知不要修改函数的参数,那么可能存在与之相关的推理。无论这种推理是什么,都将适用于Lua和Java,因为它们具有类似的函数参数语义。这些原因可能是(但不限于)一个或多个:
如果您修改参数...您将不再拥有它。如果您突然需要原始价值,那么它现在已经消失了。
根据参数的命名方式产生混淆。单词"开始"暗示某事的开始。如果你改变它,它不再是开头,而只是你正在操作的当前元素。
创建潜在错误,如果处理引用类型(Java中的非基本类型,Lua中的表等)。修改对象时,您需要为每个人更改它。增加整数只是改变你的本地值。因此,如果您经常修改参数,您仍需要考虑应该选择哪些参数以及哪些不应该参考。
换句话说,如果你同意在Java中这样做的建议,那么它同样适用于Lua。如果您不同意Java中的建议,那么您没有理由在Lua下遵循它。
答案 2 :(得分:1)
在Lua函数中,线程,表和userdata类型通过引用传递。因此,除非您有其中一个正在使用本地副本。
所以在你的例子中:
function do_stuff(begin, last)
--stuff
begin = begin + 1
last = last - 1
--stuff
end
begin
和last
是do_stuff
范围内的本地非参考变量。
复制它们的唯一原因是您可能希望存储初始值以供以后使用。为此,您可以创建初始值的备份副本,也可以创建它的工作副本。无论你喜欢什么。
只有确保您知道通过引用传递的内容以及值的内容,这样您才能避免更改您不想更改的内容,反之亦然。