假设我将字符串插入表中,如下所示:
table.insert(tbl, mystring)
并且通过在mystring
中将所有出现的“a”替换为“b”来生成input
:
mystring = string.gsub(input, "a", "b")
将两者合并为一个语句的明显方法不起作用,因为gsub
会返回两个结果:
table.insert(tbl, string.gsub(input, "a", "b")) -- error!
-- (second result of gsub is passed into table.insert)
我认为,这是支持多个回报值所支付的价格。问题是,是否有一种标准的内置方式来选择第一个返回值?当我发现select
时,我认为这正是它所做的,但唉,它实际上从N开始选择所有结果,因此在这种情况下没有帮助。
现在我知道我可以按如下方式定义自己的select
:
function select1(n, ...)
return arg[n]
end
table.insert(tbl, select1(1, string.gsub(input, "a", "b")))
但这看起来并不正确,因为我希望有一种内置的方法。
那么,我错过了一些内置构造吗?如果没有,Lua开发人员是否倾向于使用单独的变量来提取正确的参数或编写自己的select1
函数?
答案 0 :(得分:11)
您可以用括号括起表达式:
table.insert(tbl, (string.gsub(input, "a", "b")))
这将仅选择第一个结果。
要获得第n个结果,您可以使用select
并用括号括起来:
func1( (select(n, func2())) )
答案 1 :(得分:5)
将表达式放入括号中,如下所示:
table.insert(tbl, (string.gsub(input, "a", "b")))
将强制返回一个值。或者你可以像这样抓住他们:
str,cnt = string.gsub(input, "a", "b")
table.insert(tbl, str)
甚至更好,虚拟抓住它来保存变量:
str,_ = string.gsub(input, "a", "b")
table.insert(tbl, str)
答案 2 :(得分:5)
在一行中:({ funct(args) })[n]
将返回第n个结果而不声明任何命名变量。