4个参数及以下的函数功能

我必须写一个函数join(a,b,c,d),它最多可以接受4个字符串,并用逗号将它们连接在一起。当给定少于4个字符串时,函数仍应该工作,包括当只给定一个字符串作为参数时,只打印出一个没有逗号的字符串。然而,我只能让它在3个字符串的情况下工作

function join(a,b,c,d)
    if b == nil then
      print(a .. ", " .. c .. ", " .. d)
    elseif c == nil then
        print(a .. ", " .. b .. ", " .. d)
    elseif d == nil then
        print(a .. ", " .. b .. ", " .. c)
    else
        print(a .. ", ".. b .. ", " .. c .. ", " .. d)
    end
end

我不知道如何让它接受少于3个参数,请帮忙

点赞
用户6749410
用户6749410

你想达到的效果可以通过大多数编程语言所谓的“默认/可选参数”实现。然而,Lua似乎会有点不同 - 它只有在函数中实际使用参数(而不是将其包围在检查nil的条件中)时才真正需要该参数 - 所以你的方法实际上是正确的,只是缺少了一些条件语句的魔力。按以下方式重写你的程序,你会发现函数可以达到你的需求:

function join(a,b,c,d)
    io.write(a)
    if b ~= nil then
        io.write(", " .. b)
    end
    if c ~= nil then
        io.write(", " .. c)
    end
    if d ~= nil then
        io.write(", " .. d)
    end
end

join('test')
join('test', 'test1')
join('test', 'test1', 'test2')
join('test', 'test1', 'test2', 'test3')

在这里测试代码:https://jdoodle.com/a/qoc

关于你的版本的更改的重要说明:注意它只是if块,而不是if-else块。这是主要使“流程控制”能够检查最后3个参数中可能不存在的内容。你可能需要进一步阅读“流程控制”和“条件语句”的相关内容。

注:用io.write替换了print,因为:

  1. io.write不会默认在其输出末尾附加换行符,因此你可以在同一行上打印出你的单词,仅用逗号和空格分隔。
  2. 供将来参考:如这些答案中的讨论所指出的那样,io.write是首选的输出方法。

进一步参考:

  • 查看关于“默认/可选参数”及其Lua等效项的讨论。由于你实际上没有任何所谓的“默认”值,你的可选参数简单地检查它们的nil条件就足够了。通常情况下,你可能想使用一个“默认”值,那么这个讨论详细介绍了在Lua中如何实现。
2018-03-17 02:29:04
用户5675002
用户5675002

如果您只需要连接并打印这些字符串输入,甚至不需要给参数命名:

local function join(...)
    print(table.concat({...}, ", ")
end

join("a")
join("a","b")
join("a","b","c")
join("a","b","c","d","e","f","blah-blah","as many as you want", "even more")
2018-03-17 07:37:17