Ich möchte einen Versand für einen benutzerdefinierten Typ erstellen können, der im Wesentlichen eine Inplace-Kopie erstellt. Ich möchte es jedoch typenstabil machen und möchte daher vermeiden, direkt getfield
zu verwenden, und stattdessen versuchen, eine generierte Funktion zu verwenden. Ist es möglich, dass ein Typ wieGenerieren von typisierten 'getfield'-Aufrufen mit generierten Funktionen
type UserType{T}
x::Vector{T}
y::Vector{T}
z::T
end
einig Funktion zu erzeugen
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
Die recursivecopy!
in RecursiveArrayTools.jl dies macht handhabt verschachtelt (Vector{Vector}
) Typen gut, aber das Problem ist nur, dass ich nicht kenne die Felder, die der Benutzer im Voraus haben wird, nur zur Kompilierzeit, wenn diese Funktion aufgerufen würde. Klingt wie ein Job für generierte Funktionen, aber ich weiß nicht genau, wie ich das erzeugen soll.
Aber dann können Sie nicht über das Array "args" Schleife, richtig? Ich muss dann die Schleife durchlaufen und 'typeof (args [i])' überprüfen und einfach die 'A.' Aufrufe durch' args [i] 'ersetzen, aber ist das dann nicht mehr nachvollziehbar? Muss ich irgendwie ein Cartesian benutzen? –
Siehe meine Bearbeitung. Sie müssen definitiv nicht Base.Cartesian verwenden ... die zwei Beispiele, die ich gab, sind im Grunde '@ ncall' bzw.' @nexprs'. Ich finde Spleißen, um zugänglicher zu sein ... und es ist auch viel verallgemeinerbar. –
Das hat wunderbar funktioniert. Vielen Dank. –