朱莉娅朗:错误?初始化可空数组
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) 中已贬值,请考虑改用 Nothing
或 Missing
类型:
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
如果加载模块 Missings
,Missing
类型也适用于 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
,则所有这些示例也适用于多维数组。
我正在尝试初始化一个给定大小的可空整数数组。我的目的是向数组添加元素并能够计算数组中可空元素的数量。
但是我注意到了以下行为。 运行 以下代码:
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) 中已贬值,请考虑改用 Nothing
或 Missing
类型:
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
如果加载模块 Missings
,Missing
类型也适用于 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
,则所有这些示例也适用于多维数组。