gpt4 book ai didi

types - 抽象类型子类型的通用构造函数

转载 作者:行者123 更新时间:2023-12-03 05:13:21 24 4
gpt4 key购买 nike

我有一个类型 AbstractT ,对于每个子类型,我想定义一个构造函数 T(x::Tuple),但我找不到通用的方法这样做是因为 Julia 中的所有内容都使用分派(dispatch),但我无法在构造函数上分派(dispatch),因为构造函数的名称与类型匹配,因此每个构造函数都是不同的函数。也就是说,如果有

就可以了
construct{T<:AbstractT}(::Type{T},x::Tuple) = # Define all the constructors

我在内部这样做了,但是它不能很好地与其他直接调用 T(x) 并出错的包一起使用。 Julia 是否以某种我可以利用的方式在幕后使用调度?

最佳答案

这看起来有点滑稽,但实际上您可以根据函数本身的类型进行分派(dispatch)!对于构造函数,函数就是所讨论的类型:

julia> abstract type AbstractT end

julia> struct ConcreteT{T} <: AbstractT; end

julia> (::Type{ConcreteT{Int}})() = 1

julia> (::Type{ConcreteT{Float64}})() = 2

julia> ConcreteT{Int}()
1

julia> ConcreteT{Float64}()
2

您甚至可以使用类型参数……它们位于函数名称和参数列表之后的正常位置:

julia> (::Type{ConcreteT{T}})() where {T<:Number} = 3


julia> (::Type{ConcreteT{T}})() where {T<:AbstractArray} = 4

julia> ConcreteT{Float32}()
3

julia> ConcreteT{UnitRange{Int}}()
4

您甚至可以使用抽象类型执行此操作,但要注意:

julia> (::Type{T})() where {T<:AbstractT} = 5

julia> ConcreteT{String}()
ConcreteT{String}()

julia> AbstractT()
5

为什么抽象构造函数不适用于ConcreteT{String}?回想一下,Julia 为您创建了构造函数……并且由于这只是调度,因此这些构造函数更加具体并且优先:

julia> methods(ConcreteT{String})
# 2 methods for type constructor:
[1] (::Type{ConcreteT{T}})() where T in Main at REPL[2]:1
[2] (::Type{T})() where T<:AbstractT in Main at REPL[12]:1

所以使用该功能时需要小心;仅当它不与您的叶子构造函数发生冲突时它才会起作用:

julia> (::Type{T})(x) where {T<:AbstractT} = x

julia> ConcreteT{String}(6)
6

julia> ConcreteT{Int}(7)
7

关于types - 抽象类型子类型的通用构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40160120/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com