-1

这是我在不使用表格的情况下将字符串分解为每个单独字符的列表的代码:

function explode(s)
    if#s==1 then
        return s
    end
    return s:sub(1,1),explode(s:sub(2))
end

其中#s==#({explode(s)})
为了使这段代码更短,我想这样做:

function explode(s)
    return#s>1 and(s:sub(1,1),explode(s:sub(2)))or s
end

但这不起作用,因为 '[condition] a and [result value] b or [alternative] c' 不需要多个结果或替代方案。是否有其他方法可以仅使用一条语句返回相同的结果?

4

3 回答 3

6

这是另一个想法:

function explode(s)
    return s:match(("(.)"):rep(s:len()))
end

请注意,这不是很有效。

于 2013-09-04T05:28:36.393 回答
1

在一行中,您可以执行以下操作:

function explode(s)
  return unpack(#s > 1 and {s:sub(1,1), explode( s:sub(2) )} or {s})
end

警告,这不是有效的。

于 2013-09-04T02:26:28.543 回答
0

这是另一个使用尾递归优化的版本,因此效率更高:

function explode_helper( s, pos, ... )
    if pos <= 0 then return ... end
    return explode_helper( s, pos - 1, s:sub( pos, pos ), ... )
end

function explode( s )
    local n = #s
    return explode_helper( s, n - 1, s:sub( n ) )
end

print( explode "Hello World" )

此方法的限制是 Lua vararg ( ...) 可以处理的最大参数数。Lua 5.1 的 IIRC 约为 8000。Lua 5.2 增加了这个数字。

于 2013-09-04T04:45:32.637 回答