当我尝试Array
使用列表推导创建一个时,Array{Any, 1}
即使我将所有元素编码为"symbol" ,它也会产生:
julia> u_col_names=[symbol("user_id"), symbol("age"), symbol("sex"), symbol("occupation"), symbol("zip_code")] 5-element Array{Symbol,1}: :user_id :age :sex :occupation :zip_code julia> col_names=["user_id", "age", "sex", "occupation", "zip_code"] 5-element Array{ASCIIString,1}: "user_id" "age" "sex" "occupation" "zip_code" julia> u_col_names=[symbol(col_names[i]) for i in 1:size(col_names)[1]] 5-element Array{Any,1}: :user_id :age :sex :occupation :zip_code
为什么最后一个列表理解返回Array{Any, 1}
而不是Array{Symbol, 1}
?请注意,以下内容确实返回Array{Symbol, 1}
:
julia> u_col_names=[symbol("col_names$i") for i in 1:size(col_names)[1]] 5-element Array{Symbol,1}: :col_names1 :col_names2 :col_names3 :col_names4 :col_names5
有趣的是,以下内容也是如此:
julia> col_names[1] "user_id" julia> symbol(col_names[1]) :user_id julia> [symbol(col_names[1]), symbol(col_names[2])] 2-element Array{Symbol,1}: :user_id :age
我错过了什么?
根据GitHub上回购问题跟踪器中的讨论,问题似乎源于Julia的类型推理系统的缺陷.Jeff Bezanson(朱莉娅作家和维护者之一)在另一场讨论中留下了相关评论:JuliaLang/julia
目前实际上预计会出现此行为.由于[
col_names
]是全局的,它可能会在任何地方改变,所以我们不能假设我们知道它的类型.这是过于悲观,但很难提出一个让我们做得更好的规则.
令人惊讶的是,也许(如John Myles White所观察到的),如果这些操作是在函数内部执行的,则正确推断出类型:
julia> function fun() col_names=["user_id", "age", "sex", "occupation", "zip_code"] return u_col_names=[symbol(item) for item in col_names] end fun (generic function with 1 method) julia> fun() 5-element Array{Symbol,1}: :user_id :age :sex :occupation :zip_code
至于你的列表理解的选择,你可以使用map(symbol, <Array{T,1}>)
,这确实返回Array{Symbol,1}
,即使在全球范围内,:
julia> col_names=["user_id", "age", "sex", "occupation", "zip_code"] 5-element Array{ASCIIString,1}: "user_id" "age" "sex" "occupation" "zip_code" julia> map(symbol, col_names) 5-element Array{Symbol,1}: :user_id :age :sex :occupation :zip_code