2016-11-17 2 views
5

добавляющего элемент в массив в Юле работает следующим образом:Юлия: Добавление элемента в массив пользовательских типов

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

Когда я пытаюсь это с помощью пользовательского типа

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

я получаю следующее сообщение об ошибке:

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

Я предполагаю, что я должен «внедрить» метод length, но не знаю, как.

ответ

8

Команда append! не делает то, что вы делаете nk это делает. Вы думаете о команде push!.

Команда append!добавляет два массива вместе. Оба аргумента должны быть массивами:

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

Нет length реализации необходимо
(эта ошибка была просто говорю вам, он пытался прочитать длину вашего массива для второго аргумента и нашел то, что не был массивом.)

+0

или просто используйте 'push!', Что, кажется, вы все равно пытаетесь сделать. –

+0

Интересно, что 'append! (V, 1)' работает, хотя ... может быть там для удобства, но, согласно документации для 'append!', Он не должен ... не уверен, что это должно быть сообщено как ошибка или нет ... :) –

+0

hm, я вижу, 'append! (v, 1)' работает, потому что 'length (1)' возвращает '1'. (длина (x :: Number) = 1; 'определена в number.jl строка 14) –

1

Попробуйте

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

тогда вы получите

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

вы должны явно создать функцию для этого конкретного типа, как append! или любой из Base функций иногда (или, возможно, всегда я havent checked) не принимается Any