如果您有一個對同一對象的引用數組,並嘗試對其中的一個進行變異,那麼您將得到該結果,例如,如果使用fill()
功能,以填補對象的數組,可能導致以下問題:
julia> s=Vector{Points}(3)
3-element Array{Points,1}:
#undef
#undef
#undef
julia> fill!(s,Points(NaN,NaN,NaN))
3-element Array{Points,1}:
Points(NaN,NaN,NaN)
Points(NaN,NaN,NaN)
Points(NaN,NaN,NaN)
julia> s[1].x=1
1.0
julia> s
3-element Array{Points,1}:
Points(1.0,NaN,NaN)
Points(1.0,NaN,NaN)
Points(1.0,NaN,NaN)
爲了避免這種問題的使用數組,理解來填補它:
s=[Points(NaN,NaN,NaN) for i=1:3]
但是我從您的示例代碼看到的是:
Points
數據類型沒有自定義constructor
並且此外,s
數組還沒有初始化化的。
julia> s = Array(Points,1,4)
1x4 Array{points,2}:
#undef #undef #undef #undef
所以如果你嘗試變異元素上,你會得到一個錯誤:
最小的變化
julia> s[1].x
ERROR: UndefRefError: access to undefined reference
in getindex at array.jl:282
一個解決方案是使用Points
默認構造函數是這樣的:
s[1]=Points(NaN,NaN,NaN)
後您將能夠變異s
,s[1].x=4.28
其次具有Points
類型的zero
,應添加zero(::Points)
方法:
julia> import Base.zero
julia> zero(::Points)=Points(0,0,0)
zero (generic function with 14 methods)
julia> zero(Points(1,2,3))
Points(0.0,0.0,0.0)
提示:使用1XN陣列來處理N個元素的Array
是不是最好的選擇,Refer,使用Vector{Type}(N)
代替。