在Lua中参数应该用作变量吗?

在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

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
}
所以,我一直在卢阿做这件事

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”传递的。变量不能作为实际参数引用。(从语法上讲,无论多么简单,实际参数始终是表达式,并且表达式不能被赋予新值。)