在http://learnxinyminutes.com/docs/julia/上阅读Julia时,我发现了这个:
# You can define functions that take a variable number of
# positional arguments
function varargs(args...)
return args
# use the keyword return to return anywhere in the function
end
# => varargs (generic function with 1 method)
varargs(1,2,3) # => (1,2,3)
# The ... is called a splat.
# We just used it in a function definition.
# It can also be used in a fuction call,
# where it will splat an Array or Tuple's contents into the argument list.
Set([1,2,3]) # => Set{Array{Int64,1}}([1,2,3]) # produces a Set of Arrays
Set([1,2,3]...) # => Set{Int64}(1,2,3) # this is equivalent to Set(1,2,3)
x = (1,2,3) # => (1,2,3)
Set(x) # => Set{(Int64,Int64,Int64)}((1,2,3)) # a Set of Tuples
Set(x...) # => Set{Int64}(2,3,1)
我确信这是一个非常好的解释,但是我没有理解主要的想法/好处。
据我所知,到目前为止:
我认为我不理解这一点的部分原因是我在使用元组和数组的定义,在Julia中是元组和数组数据类型(如Int64是数据类型)吗?或者它们是数据结构,什么是数据结构?当我听到数组时,我通常会考虑2D矩阵,也许不是在编程环境中想象数组的最佳方法?
我意识到你可能会写一本关于数据结构是什么的全书,我当然可以谷歌,但我发现那些对某个主题有深刻理解的人能够更简洁地解释它(和也许是简化的方式然后让我们说维基百科文章可以,这就是为什么我问你们(和女孩)。
答案 0 :(得分:7)
您似乎已经获得了机制以及他们如何/他们做了什么,但正在努力使用它。我知道了。
我发现它们对于我需要传递未知数量的参数并且在交互使用函数时传递它之前不必先构建数组的事情非常有用。
例如:
func geturls(urls::Vector)
# some code to retrieve URL's from the network
end
geturls(urls...) = geturls([urls...])
# slightly nicer to type than building up an array first then passing it in.
geturls("http://google.com", "http://facebook.com")
# when we already have a vector we can pass that in as well since julia has method dispatch
geturls(urlvector)
所以要注意一些事情。 Splat允许您将迭代变为数组,反之亦然。请参阅上面的[urls...]
位? Julia把它变成了一个带有urls元组扩展的Vector,结果证明它比我在经验中自己的参数更有用。
这只是他们证明对我有用的一个例子。当你使用朱莉娅时,你会遇到更多。
它主要用于帮助设计自然使用的api。