如何使函数接受动态参数?

当处理 function(v1,v2,v3) 或 function(...) 时,似乎没有一种很好的方法处理调用函数时参数的位置更改。

示例函数:

my_function(v1,v2,v3) {
  print(v1, v2, v3)
}

示例 args 函数:

my_args_func(...) {
  local arg = {...}
  for i,v in ipairs(arg) do
    print(v)
  end
}

从以上两个例子中,你可以这样做

my_function(set1,set2,set3)
my_arg_func(set1,set2,set3)

但是,如果你想对它们进行更改,这将变成管理所有函数参数更新的同样的劳什子。

假设我们想为两个函数添加一个新值。newval10。

对于 my_function(),我们将被迫将它放在最后,如 my_function(v1,v2,v3,newval10) 或者除非我们更新调用和函数参数接受的内容,否则它们不会正常工作。

对于 func(...),我们只知道索引值和实际值。不知道它们代表什么。是否有一种方法可以拥有以下函数:

local my_generic_func(...) {
  -stuff goes here
}
if my_generic_func(v1,v2,v3) then return end

可以使用 my_generic_func(v1,v5,v3,v4,v2) 进行更新,并且函数将知道每个值实际上在哪里。

点赞
用户11405174
用户11405174

你需要给一个函数一个任意名称的单个参数,然后将其用作其余的参数。

local function generic(par)
  _generic(par.arg1 or 0, --设置默认值为0
    par.arg2 or "arg2",
    par.arg3 --默认为“false”或“nil”
  )
end

使用方法如下:

a = generic{12,"alpha"} --注意使用花括号

这将使用参数12"alpha"和默认值nil执行generic函数。

要特指你正在设置的变量,可以这样做:

a = generic{arg1=12,arg2="alpha"}

不管你如何设置arg1/arg2的顺序,都不会影响。

但是,您不能接受预先未定义的额外参数,例如,如果您尝试在花括号内给函数四个参数,它将出现错误。

本质上,这是将一个表输入到具有一个参数的函数中,然后从该表派生信息而不是多个参数。

2019-11-08 10:23:36