参数是否应该用作Lua中的变量?

时间:2016-03-31 15:38:57

标签: 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
  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

也是气馁,还是简洁明了?

3 个答案:

答案 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

beginlastdo_stuff范围内的本地非参考变量。

复制它们的唯一原因是您可能希望存储初始值以供以后使用。为此,您可以创建初始值的备份副本,也可以创建它的工作副本。无论你喜欢什么。

只有确保您知道通过引用传递的内容以及值的内容,这样您才能避免更改您不想更改的内容,反之亦然。