Lua中,是否应该将参数作为变量使用?

我在Java中被告知应避免修改原始参数,例如

public int doStuff(int begin, int end) {
  /* 循环或其他操作 */
  begin++; //不好
  end--; //也不好
  /* 结束循环 */
  return
}

相反,我应该这样做

public int doStuff(int begin, int end) {
  int myBegin = begin; //类似于这样
  int myEnd = end;
  /* 操作 */
  返回结果
}

所以,我在Lua中也这样做

function do_stuff(begin, last)
  local my_begin = begin
  local my_last = last
  --操作
  my_begin = my_begin + 1
  my_last = my_last - 1
  --操作
end

但是,我想知道

function do_stuff(begin, last)
  --操作
  begin = begin + 1
  last = last - 1
  --操作
end

是否也被不赞成,或者说它既简洁又好?

点赞
用户734069
用户734069

如果你被告知不要修改函数参数,那么可能有一个与此相关的原因。这些原因适用于Lua和Java,因为它们具有类似的函数参数语义。这些原因可能是一种或多种(但不仅仅限于):

  • 如果你修改一个参数……你就没有它了。如果你突然需要你传递的原始值,它现在已经消失了。

  • 根据参数的命名方式,会造成混淆。单词“begin”(开始)暗示着某个开始。如果你修改它,它 不一定还是一个开始,而只是你正在操作的当前元素。

  • 如果处理引用类型(Java中的非基本类型,如Lua中的表等),可能会产生潜在的错误。当你修改一个对象时,你改变的是所有人的对象。而递增一个整数只是改变你的本地值。因此,如果你经常修改参数,你仍然需要考虑哪些参数是应该被修改的,哪些参数不应该被修改。

换句话说,如果你同意在Java中这样做的建议,那么它同样适用于Lua。如果你不同意Java中的建议,那么你没有理由在Lua下遵循它。

2016-03-31 16:13:19
用户107090
用户107090

没有规则。让口味、清晰度和需要来决定。

尽管如此,一个常见的习惯用法是为参数提供默认值,如下所示:

function log(x,b)
   b = b or 10
   ...
end
2016-03-31 16:45:21
用户2858170
用户2858170

在 Lua 函数中,线程、表格和用户数据类型都是通过引用传递的,因此除非你正在使用其中之一,否则你正在使用的是本地副本。

因此,在你的例子中:

function do_stuff(begin, last)
  --stuff
  begin = begin + 1
  last = last - 1
  --stuff
end

beginlastdo_stuff 作用域中的本地非引用变量。

唯一需要复制它们的原因是你可能想要存储它们的初始值以便以后使用。为此,你可以创建初始值的备份副本,或者你可以创建一个工作副本。无论你选择哪种方式,只要确保你知道是通过引用传递还是通过值传递,这样你就可以避免改变你不想改变的东西,反之亦然。

2016-04-01 08:23:35