2016-11-17 5 views
5

ein Element in ein Array in Julia Anfügen funktioniert wie folgt:Julia: ein Element anhängen auf ein Array von benutzerdefinierten Typen

v = Array{Int32, 1}(0) 
append!(v, 1) 
append!(v, 2) 
println(v) # prints: Int32[1,2] 

Wenn ich versuche, dies mit einem benutzerdefinierten Typ

type Node 
    label::String 
    value::Int32 
end 
nodes = Array{Node, 1}(0) 
append!(nodes, Node("a", 42)) 

ich der folgende Fehler:

ERROR: LoadError: MethodError: no method matching length(::Node) 

ich nehme an, ich habe zu ‚implementieren‘ die length Methode, aber nicht wissen, wie.

Antwort

8

Der append! Befehl tut nicht, was Sie thi nk es tut. Sie denken an den Befehl push!.

Der append! Befehl hängt zwei Arrays zusammen. Beide Argumente müssen Arrays sein:

julia> append!(nodes, [Node("a", 42)]) 
1-element Array{Node,1}: 
Node("a",42) 

Keine length Implementierung notwendig
(dieser Fehler erzählte man nur versucht, die Länge des Arrays für das zweite Argument zu lesen und fand etwas, das kein Array war.)

+0

oder, einfach 'push!' Verwenden, was es scheint, dass du versuchst, es trotzdem zu tun. –

+0

es ist interessant, dass 'append! (V, 1)' funktioniert obwohl ... könnte es für die Bequemlichkeit, aber nach der Dokumentation für 'append!' Sollte es nicht ... nicht sicher, ob dies als a gemeldet werden sollte Fehler oder nicht ... :) –

+0

hm, ich sehe, 'append! (v, 1)' funktioniert, weil 'length (1)' '' 'zurückgibt. ('length (x :: Number) = 1;' definiert in numbers.jl Zeile 14) –

1

Versuchen Sie, diese

Base.append!(x::Array{Node,1}, val::Node) = push!(x, val) 

dann erhalten Sie

append!(nodes, Node("a", 42)) 
1-element Array{Node,1}: 
Node("a",42) 

Sie haben explizit eine Funktion für diesen speziellen Typ als append! oder einen der manchmal Base Funktionen erstellen (oder vielleicht immer ich nicht akzeptiert Any

Verwandte Themen