在Julia中实现相互嵌套结构的问题

时间:2019-02-12 18:19:40

标签: struct types nested julia

我正在尝试定义两个结构,即Node和Edge。 一个节点包含一组边,而一条边包含目标节点和到达该节点的概率。由于其余问题的结构方式,我无法避免拥有Edge对象。

struct Node
edges::Vector{Edge}
end

struct Edge
    next::Node
    probability::Float64
end

每当我尝试运行整个脚本时,都会收到“ UndefVarError:Edge未定义”。

如果仅尝试运行边缘部分,则会显示“ UndefVarError:Node未定义”。

是否有一种方法(像C语言一样)预先声明结构,或告诉julia一起处理这两个结构?

2 个答案:

答案 0 :(得分:4)

如何使用抽象类型:

abstract type AbstractEdge end;

struct Node{T <: AbstractEdge}
    edges::Vector{T}
end

struct Edge <: AbstractEdge
    next::Node{Edge}
    probability::Float64
end

Node() = Node{Edge}(Edge[])

如果进行任何图形计算,请考虑使用LightGraphs.jl,其中包含的加权图形可能满足您的需求。

答案 1 :(得分:2)

据我所知尚无法解决,请参见https://github.com/JuliaLang/julia/issues/269

在这种情况下,可以定义介于中间的抽象类型,直到问题解决为止:

<MenuItem Header="Open Files" Name="MiInsertOpen"
        d:DataContext="{d:DesignInstance Type={x:Type core:DBInterface}}"
        ItemsSource="{Binding InsertableDBs}">
    <MenuItem.ItemContainerStyle>
        <Style TargetType="MenuItem">
            <Setter Property="Header" Value="{Binding DisplayName}" />
            <Setter Property="ToolTip" Value="{Binding FilePath}" />
            <Setter Property="Command" Value="{Binding DataContext.CmdInsert, 
                    RelativeSource={RelativeSource FindAncestor, 
                    AncestorType=MenuItem, AncestorLevel=2}}" />
            <Setter Property="CommandParameter" Value="{Binding FilePath}" />
        </Style>
    </MenuItem.ItemContainerStyle>
</MenuItem>