在 Julia 中构造 Array{Any} 时防止类型更改

Prevent type changes when constructing an Array{Any} in Julia

我想像这样创建一个数组{Any}:

julia> Array{Any}([false   ,  0.5,  5 ])
3-element Vector{Any}:
 0.0
 0.5
 5.0

但它将 Bool 和整数转换为浮点数。但是当我有一个字符串时,它不会进行类型转换。

julia> Array{Any}([false,0.5,5,"test"])
4-element Vector{Any}:
 false
 0.5
 5
 "test"

简单的解决方法是创建数组,然后将每个条目手动转换为我最初编写的类型。或者执行第二个选项,然后删除最后一个条目。有没有一种更简洁(最好是一行)的方法来使数组完全符合我最初编写的类型?

就这样:

julia> Any[false, 0.5, 5]
3-element Vector{Any}:
 false
     0.5
     5

注意:

julia> [false, 0.5, 5]
3-element Vector{Float64}:
 0.0
 0.5
 5.0

因此,它正在创建 Float64Vector,因为这是一种捕获所有值并用 Vector{Any}() 包装的类型,为时已晚。

如果你不关心类型和编译加速你可以这样写:

julia> [false,0.5,5,"test"]
4-element Vector{Any}:
 false
 0.5
 5
 "test"

如果你更关心类型,你可以使用这个:

julia> a = Union{Bool, Float64, Int, String}[false, 0.5, 5, "test"]
4-element Vector{Union{Bool, Float64, Int64, String}}:
 false
 0.5
 5
 "test"

更好但不是很好。异构数组在 Julia 中不是一个好习惯。使用 composite types or tuples 构建您的数据使事情更具可读性(和自我记录)并且可能会提高您的表现。