在Julia中,返回一个元组值以模拟返回多个值。但是,可以在不需要括号的情况下创建和分解元组,从而产生一种幻想,即返回多个值而不是单个元组值。例如,以下函数返回一对值:
julia> function foo(a,b)
a+b, a*b
end
foo (generic function with 1 method)
如果在交互式会话中调用它而未在任何地方分配返回值,则将看到返回的元组:
julia> foo(2,3)
(5, 6)
但是,这种返回值对的典型用法是将每个值提取到变量中。Julia支持简单的元组“解构”,从而简化了此过程:
julia> x, y = foo(2,3)
(5, 6)
julia> x
5
julia> y
6
您还可以通过显式使用return
关键字来返回多个值:
function foo(a,b)
return a+b, a*b
end
与的先前定义完全相同foo
。
Varargs函数
能够编写带有任意数量参数的函数通常很方便。此类函数在传统上称为“可变参数”函数,是“可变数量的参数”的缩写。您可以在最后一个参数后面加上省略号来定义varargs函数:
julia> bar(a,b,x...) = (a,b,x)
bar (generic function with 1 method)
变量a
和b
通常绑定到前两个参数值,变量x
绑定到bar
在其前两个参数之后传递的零个或多个值的可迭代集合:
julia> bar(1,2)
(1, 2, ())
julia> bar(1,2,3)
(1, 2, (3,))
julia> bar(1, 2, 3, 4)
(1, 2, (3, 4))
julia> bar(1,2,3,4,5,6)
(1, 2, (3, 4, 5, 6))
在所有这些情况下,x
都绑定到传递给的尾随值的元组bar
。
可以限制作为变量参数传递的值的数量。稍后将在参数约束Varargs方法中对此进行讨论。
另一方面,将可迭代集合中包含的值作为单独的参数“拼接”到函数调用中通常很方便。为此,还可以...
在函数调用中使用but:
julia> x = (3, 4)
(3, 4)
julia> bar(1,2,x...)
(1, 2, (3, 4))
在这种情况下,值的元组被精确地连接到varargs调用中,该变量位于可变参数数目所在的位置。但是,不必如此:
julia> x = (2, 3, 4)
(2, 3, 4)
julia> bar(1,x...)
(1, 2, (3, 4))
julia> x = (1, 2, 3, 4)
(1, 2, 3, 4)
julia> bar(x...)
(1, 2, (3, 4))
此外,拼接到函数调用中的可迭代对象不必是元组:
julia> x = [3,4]
2-element Array{Int64,1}:
3
4
julia> bar(1,2,x...)
(1, 2, (3, 4))
julia> x = [1,2,3,4]
4-element Array{Int64,1}:
1
2
3
4
julia> bar(x...)
(1, 2, (3, 4))
同样,参数要加入的函数不必是varargs函数(尽管通常是这样):
julia> baz(a,b) = a + b;
julia> args = [1,2]
2-element Array{Int64,1}:
1
2
julia> baz(args...)
3
julia> args = [1,2,3]
3-element Array{Int64,1}:
1
2
3
julia> baz(args...)
ERROR: MethodError: no method matching baz(::Int64, ::Int64, ::Int64)
Closest candidates are:
baz(::Any, ::Any) at none:1
如您所见,如果拼接容器中的元素数量错误,则函数调用将失败,就像显式给出太多参数一样。