MethodError вызывает конструктор параметрической структуры - PullRequest
0 голосов
/ 06 июня 2018

Я пытаюсь создать связанный список в Юлии.У меня есть:

mutable struct LLNode{T}
    x::T
    next::Union{LLNode{T},Void}
    prev::Union{LLNode{T},Void}
end

mutable struct LinkedList{T}
   count::Int
   head::Union{LLNode{T},Void}
   tail::Union{LLNode{T},Void}
end

Теперь приведенный выше код компилируется нормально.Я также могу запустить: x = LLNode(0,nothing,nothing) хорошо.Но когда я запускаю y = LinkedList(0,nothing,nothing), я получаю ошибку no method matching LinkedList(::Int64, ::Void, ::Void).Что дает?

VERSION возвращает v"0.6.2"

Ответы [ 2 ]

0 голосов
/ 06 июня 2018

Когда вы пишете LLNode(0,nothing,nothing), Джулия может выяснить, что ей нужно построить LLNode{Int} на основе типа первого аргумента.Но в LinkedList(0, nothing, nothing) буквально нечего определять, каким должен быть параметр типа, поэтому он не знает, что нужно создать.

Вместо этого вам либо нужно явно выбрать то, что вам нужно.хотите, чтобы T было:

julia> LinkedList{Int}(0, nothing, nothing)
LinkedList{Int64}(0, nothing, nothing)

или он может получить T на основе аргумента "не-ничто":

julia> LinkedList(0, LLNode(0, nothing, nothing), nothing)
LinkedList{Int64}(0, LLNode{Int64}(0, nothing, nothing), nothing)
0 голосов
/ 06 июня 2018

Причина в том, что LinkedList требует параметр T.Если вы передадите nothing в качестве второго и третьего аргумента, Джулия не сможет сделать вывод, что такое T.

Поэтому вы должны либо явно указать его, например:

julia> LinkedList{Int}(0, nothing, nothing)
LinkedList{Int64}(0, nothing, nothing)

или передайте второй и / или третий аргумент, позволяющий сделать вывод T, например, используя свой x:

julia> LinkedList(0, x, x)
LinkedList{Int64}(0, LLNode{Int64}(0, nothing, nothing), LLNode{Int64}(0, nothing, nothing))

В качестве примечания - вы можете захотеть проверить https://github.com/ChrisRackauckas/LinkedLists.jl для примера довольно полной реализации связанного списка.

...