朱莉娅朗:错误?初始化可空数组

Julia Lang: Error? Initializing Nullable Arrays

我正在尝试初始化一个给定大小的可空整数数组。我的目的是向数组添加元素并能够计算数组中可空元素的数量。

但是我注意到了以下行为。 运行 以下代码:

function main()
    arr = Array{Nullable{Int}}(10)
    res = 0
    for i in 1:10
        if isnull(arr[i])
             res += 1
        end
    end
    res    
end

预计为 return 10,但是程序 return 几乎每次我 运行 代码时都有不同的值。仅初始化数组:

function main()
    arr = Array{Nullable{Int}}(10)  
end

这是结果:

 Nullable{Int64}(7142821636481377634)
 Nullable{Int64}(8803814271447229814)
 Nullable{Int64}(7935455170894001012)
 Nullable{Int64}(8247625210579135584)
 Nullable{Int64}(7815275285807655200)
 Nullable{Int64}()
 Nullable{Int64}()
 Nullable{Int64}()
 Nullable{Int64}()
 Nullable{Int64}()

这里可以看出并非所有元素实际上都不是Null。这可以解释为什么函数 isnull() 不能将它们识别为 Null 对象。

这是想要的效果:

function main()
    arr = Array{Nullable{Int}}(10)
    for i in 1:10
        arr[i] = Nullable{Int}()
    end
    println(arr)  
end

这确实 return 是一个可空元素数组。不过,运行这段初始化代码似乎有点乏味。

知道如何避免这种情况吗?

在 Julia 0.6 中你可以使用 arr = fill(Nullable{Int64}(),10).

但是请注意,可空值在 Julia 0.7 (https://github.com/JuliaLang/julia/blob/master/NEWS.md) 中已贬值,请考虑改用 NothingMissing 类型:

julia> vector_with_nothing_or_int = Vector{Union{Int64, Nothing}}(nothing,10)
10-element Array{Union{Nothing, Int64},1}:
 nothing
 nothing
 [...]

julia> vector_with_missing_or_int = Vector{Union{Int64, Missing}}(missing,10)
10-element Array{Union{Missing, Int64},1}:
 missing
 missing
 [...]

检查元素是否为空或缺失可以通过以下方式完成:

julia> vector_with_nothing_or_int[1] == nothing
true

julia> ismissing(vector_with_missing_or_int[1])
true

如果加载模块 MissingsMissing 类型也适用于 Julia 0.6。这是 Julia 0.6 对应的代码:

using Missings    
vector_with_missing_or_int = Vector{Union{Int64, Missing}}(10)
vector_with_missing_or_int .= missing

vector_with_nothing_or_int = Vector{Union{Int64, Nothing}}(10)
vector_with_nothing_or_int .= nothing

运算符.=用右边的元素替换数组的每个元素。如果您在指定维数时将 Vector 替换为 Array,则所有这些示例也适用于多维数组。