Юлия: круговая ссылка - PullRequest
2 голосов
/ 02 июня 2019

Как можно решить эту проблему?

mutable struct Parent
    name::String
    children::Vector{Child}

    function Parent(name)
        return new(name)

    end

end

mutable struct Child
    name::String
    parent::Parent

    function Child(name)
        return new(name)

    end

end

parent = Parent("father")
child = Child("son")

Выдает ошибку

LoadError: UndefVarError: Дочерний элемент не определен

Есть ли некоторыеспособ справиться с этим делом?

1 Ответ

1 голос
/ 02 июня 2019

Насколько я знаю, единственный способ справиться с этим в настоящее время - через параметрический тип (я знаю, что он не идеален). Вот пример, который дополнительно ограничивает параметр, чтобы вы получили почти то, что вы хотите:

abstract type AbstractChild end

mutable struct Parent{T<:AbstractChild}
    name::String
    children::Vector{T}
    function Parent{T}(name) where {T<:AbstractChild}
        return new{T}(name)
    end

end

mutable struct Child <: AbstractChild
    name::String
    parent::Parent

    function Child(name)
        return new(name)
    end
end

Parent(name) = Parent{Child}(name)

parent = Parent("father")
child = Child("son")
...