这是我的代码,可以在不使用表格的情况下将字符串分解为每个字符的列表:
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和[result value] b或[alternative] c'不会要求有多个结果或替代品。有没有其他方法只使用一个语句返回相同的结果?
答案 0 :(得分:6)
这是另一个想法:
function explode(s)
return s:match(("(.)"):rep(s:len()))
end
请注意,这不是很有效。
答案 1 :(得分:1)
在一行上你可以做到:
function explode(s)
return unpack(#s > 1 and {s:sub(1,1), explode( s:sub(2) )} or {s})
end
警告,这 效率不高。
答案 2 :(得分: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增加了这个数字。