4
我希望能夠創建一個用戶定義類型的調度,它基本上會做一個就地副本。不過,我想以類型穩定的方式來做,因此我想避免直接使用getfield
,而是嘗試使用生成的函數。是否有可能爲一類像使用生成的函數生成類型穩定的`getfield`調用
type UserType{T}
x::Vector{T}
y::Vector{T}
z::T
end
生成一些功能
recursivecopy!(A::UserType,B::UserType)
# Do it for x
if typeof(A.x) <: AbstractArray
recursivecopy!(A.x,B.x)
else
A.x = B.x
end
# Now for y
if typeof(A.y) <: AbstractArray
recursivecopy!(A.y,B.y)
else
A.y = B.y
end
# Now for z
if typeof(A.z) <: AbstractArray
recursivecopy!(A.z,B.z)
else
A.z = B.z
end
end
在RecursiveArrayTools.jl的recursivecopy!
使得這種處理嵌套(Vector{Vector}
)類型的好,但唯一的問題是,我不只需在編譯時調用該函數就可以預先知道用戶將要使用的字段。聽起來像生成函數的工作,但我不太清楚如何生成這個。
但是,你不能遍歷'args'數組,對吧?然後我需要遍歷它並檢查'typeof(args [i])',並且用'args [i]'替換''''調用,但那麼這不會再被推斷嗎?我需要以某種方式使用笛卡爾? –
看我的編輯。你絕對不需要使用Base.Cartesian ......我給出的兩個例子基本上分別是'@ ncall'和'@ nexprs'。我覺得拼接更加平易近人,而且它也更具普遍性。 –
這工作很好。謝謝。 –