如何创建一个像 table.insert() 一样具有可变参数的函数?

我知道我可以使用 function(a, b, ...) 来解决可变参数问题。但是如果我想创建一个像 table.insert(table, [pos,] value) 这样的函数怎么办呢?当然,不是像下面这样:

function (table, pos, value)
    if value == nil then
        pos = value
        value = nil
    end
    -- do something
end
点赞
用户4687565
用户4687565

Lua 不支持函数重载或参数类型检查,如果需要的话,应该由需要的人自己实现。同时,将函数的使用方法传达给其他人也由自己决定。

如果你不满意你提供的代码片段,可以用其他方式重写它,比如:

function(arg1,arg2,arg3)
    tab=arg1
    if not arg3 then
        value=arg2
        index=#tab+1
    else
        assert(type(arg2)=='numer',"bad argument #2 to 'insert' (number expected, got table)")
        value=arg3
        index=arg2
    end
    table.insert(tab,index,value)
end

或:

f2=function(a,b)
    --do smth
end
f3=function(a,b,c) end
f=function(...)
    args={...}
    nargin=#args
    if nargin==2 then
        f2(args[1],args[2]) --一种使用可变参数的方法
    elseif nargin==3 then
        f3(...) --另一种方法
    else error("wrong number of arguments")
    end
end

我不建议你在函数中使用可选的中间位置参数。至少在没有编译时类型检查的语言中不建议这样做,即使在编译时检查类型的语言中也是如此。

如果你真的需要可选参数,可以将它们放在一个表中:

function(args)
    tab=args.table
    index=args.index or #tab+1
    value=args.value
    --其他参数、选项和相关逻辑在这里
    table.insert(tab,index,value)
end
2018-11-21 13:04:01