从逻辑语句中返回多个变量

以下是我将字符串分解为单个字符列表的代码,而不使用表格:

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' 不要求有多个结果或替代品。是否有其他方法可以仅使用一个语句返回相同的结果?

点赞
用户234175
用户234175

你可以在一行上做以下操作:

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

警告,这 不是 高效的。

2013-09-04 02:26:28
用户2633423
用户2633423

以下是使用尾递归优化的另一版本,因此更加高效:

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 可变参数( ...)可以处理的最大参数数量。据我所知,Lua 5.1 的限制约为 8000。Lua 5.2 增加了这个数字。

2013-09-04 04:45:32
用户2733013
用户2733013

下面提供另外一个思路:

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

需要注意的是,这种方式效率并不高。

2013-09-04 05:28:36