将结构字段的类型声明为与 Julia 中的结构本身相同的类型
Declare type of struct field to be the same type as the struct itself in Julia
如果我在 Julia 中定义一个结构,是否可以将其中一个字段的类型声明为与结构本身相同的类型?例如,我想定义一个结构 NodeStruct
有两个字段,data
和 next
其中 data
是一些标准类型(例如 AbstractFloat
)和 next
是 NodeStruct
类型或 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))
如果我在 Julia 中定义一个结构,是否可以将其中一个字段的类型声明为与结构本身相同的类型?例如,我想定义一个结构 NodeStruct
有两个字段,data
和 next
其中 data
是一些标准类型(例如 AbstractFloat
)和 next
是 NodeStruct
类型或 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))