来自朱莉娅关于数组理解的文档:
以下示例计算沿1-d网格的当前元素及其左右邻居的加权平均值.:
Run Code Online (Sandbox Code Playgroud)julia> const x = rand(8) 8-element Array{Float64,1}: 0.843025 0.869052 0.365105 0.699456 0.977653 0.994953 0.41084 0.809411 julia> [ 0.25*x[i-1] + 0.5*x[i] + 0.25*x[i+1] for i=2:length(x)-1 ] 6-element Array{Float64,1}: 0.736559 0.57468 0.685417 0.912429 0.8446 0.656511
注意
在上面的示例中,
x
声明为常量,因为Julia中的类型推断在非常量全局变量上不起作用.结果数组类型是从表达式推断出来的; 为了明确地控制类型,可以将类型添加到理解之前.例如,在上面的例子中,我们可以避免将x声明为常量,并通过编写以下内容确保结果的类型为Float64:
Run Code Online (Sandbox Code Playgroud)Float64[ 0.25*x[i-1] + 0.5*x[i] + 0.25*x[i+1] for i=2:length(x)-1 ]
接近末尾的音符是什么意思?也就是说,常量和非常量全局变量之间的类型推断是如何不同的?
我认为问题在于,如果x
没有声明为a const
,那么Julia不知道该变量的类型是否会发生变化(因为它永远不会超出作为全局的范围).出于这个原因,朱莉娅需要假设x
属于类型Any
.
但是,如果x
声明为a const
,则Julia可以安全地假设其类型不会更改,并且Julia可以根据该信息进行优化.
请注意,如果您不声明x
为const,那么列表推导中返回的类型将是Array{Any,1}