将结构字段的类型声明为与 Julia 中的结构本身相同的类型

Declare type of struct field to be the same type as the struct itself in Julia

如果我在 Julia 中定义一个结构,是否可以将其中一个字段的类型声明为与结构本身相同的类型?例如,我想定义一个结构 NodeStruct 有两个字段,datanext 其中 data 是一些标准类型(例如 AbstractFloat)和 nextNodeStruct 类型或 nothing。考虑给出错误 LoadError: UndefVarError: NodeStruct not defined.

的示例代码
import Base.@kwdef

@kwdef mutable struct NodeStruct{A<:AbstractFloat, B<:Union{NodeStruct, Nothing}}
    data ::A
    next ::B
end

有没有办法做到这一点?我希望能够以参数方式执行此操作,因为 performance tips suggest this and computation time is very important to me. I could not find any information in the documentation on types or constructors 可以解决此问题。

既然你知道你的结构元素是一个具体的类型,这就是:

@kwdef mutable struct NodeStruct{A<:AbstractFloat}
    data ::A
    next ::Union{NodeStruct, Nothing}
end

现在你只需使用它

julia> NodeStruct(3.5, nothing)
NodeStruct{Float64}(3.5, nothing)

如果您需要更抽象的结构,您可以这样做:

abstract type AbstractNS end

@kwdef mutable struct NodeStruct2{A<:AbstractFloat, B<:AbstractNS} <: AbstractNS
    data ::A
    next ::Union{Nothing, B}
end

为此抽象结构创建根时,您需要提供类型:

julia> root = NodeStruct2{Float64, NodeStruct2}(3.5, nothing)
NodeStruct2{Float64, NodeStruct2}(3.5, nothing)

但是对于树叶它会起作用:

julia> leaf = NodeStruct2(5.6, root)
NodeStruct2{Float64, NodeStruct2{Float64, NodeStruct2}}(5.6, NodeStruct2{Float64, NodeStruct2}(3.5, nothing))