英文:
Easy initialisation of empty containers
问题
考虑以下代码。
struct MyType
data::Dict{Int, Float64}
end
MyType() = MyType(Dict{Int, Float64}())
必须重复data
的类型有点笨拙,如果您有更多的变量和/或您的类型变得更复杂,问题会迅速变得难以处理。我可以避免这个吗?
英文:
Consider the following code.
struct MyType
data::Dict{Int, Float64}
end
MyType() = MyType(Dict{Int, Float64}())
Having to repeat the type of data
is a bit clumsy, and the problem gets out of hand very quickly if you have more variables and/or your types get more complicated. Can I avoid this?
答案1
得分: 2
如果涉及的类型是具有默认构造函数(即具有无参数构造函数)的话,您可以使用以下的技巧。
struct Default; end
Base.convert(::Type{T}, ::Default) where T = T()
struct MyType
data::Dict{Int, Float64}
end
MyType() = MyType(Default())
英文:
If the type in question is default-constructible (i.e., it has a no-args constructor), you can use the following trick.
struct Default; end
Base.convert(::Type{T}, ::Default) where T = T()
struct MyType
data::Dict{Int, Float64}
end
MyType() = MyType(Default())
答案2
得分: 1
你可以这样做:
Base.@kwdef struct MyType
data::Dict{Int, Float64} = Dict{Int, Float64}()
end
现在你可以直接写MyType()
:
julia> MyType()
MyType(Dict{Int64, Float64}())
我个人更喜欢使用Parameters包,它还影响了struct的显示方式:
using Parameters
@with_kw struct MyType
data::Dict{Int, Float64} = Dict{Int, Float64}()
end
现在在REPL中你会看到:
julia> MyType()
MyType
data: Dict{Int64, Float64}
英文:
You can do:
Base.@kwdef struct MyType
data::Dict{Int, Float64} = Dict{Int, Float64}()
end
And now you can just write MyType()
:
julia> MyType()
MyType(Dict{Int64, Float64}())
I personally more like the package Parameters which is additionally affecting how struct is displayed:
using Parameters
@with_kw struct MyType
data::Dict{Int, Float64} = Dict{Int, Float64}()
end
And now in REPL you can see:
julia> MyType()
MyType
data: Dict{Int64, Float64}
答案3
得分: 1
以下是翻译好的部分:
以下这种巧妙的方法适用(截至Julia 1.8版本):
MyType() = MyType((t() for t in MyType.types)...)
它不包括Int
或Float64
,所以它满足OP的条件。而且,它适用于具有许多字段和复杂结构的类型,因为它本质上是递归的。
英文:
The following hack-ish method works (as of Julia 1.8):
MyType() = MyType((t() for t in MyType.types)...)
It doesn't include Int
or Float64
, so it passes OP conditions. And also, it generalizes to types with many fields, and complex ones because it is essentially recursive.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论