如何从julia中的泛型类型的实例中提取特定类型?

use*_*788 6 types abstract-type julia

如何在julia中获取参数类型实例的子类型?例如:

immutable Dog{T <: Number}
    snout::T
end

dog = Dog(5.)
typeof(dog)
Run Code Online (Sandbox Code Playgroud)

...回报Dog{Float64}.有没有办法Float64从变量中获取类型dog而不明确引用该字段snout

Toi*_*son 9

这取决于您的使用案例.如果您对这样的特定情况感兴趣,一个好方法是定义一个函数

dogtype{T}(::Dog{T}) = T
Run Code Online (Sandbox Code Playgroud)

然后dogtype(Dog(.5))会给你Float 64.

这是用于eltype在基础Julia中实现该功能的一种模式.


Sal*_*apa 1

不,因为的类型dog不是Dog{Float64} Float64想一想如果您Dog用不止一种类型进行参数化,预期的输出是什么。

推荐的方法是使用方法来访问类型/不可变字段:

julia> type Foo{T <: Number, S <: AbstractString}
           bar::T
           baz::S
       end

julia> foo = Foo(5.5, "test")
Foo{Float64,ASCIIString}(5.5,"test")

julia> typeof(foo)
Foo{Float64,ASCIIString}

julia> typeof(foo.bar)
Float64

julia> typeof(foo.baz)
ASCIIString

julia> for field in names(Foo)
           @eval $(field)(x::Foo) = x.$field
       end

julia> typeof(bar(foo))
Float64

julia> typeof(baz(foo))
ASCIIString
Run Code Online (Sandbox Code Playgroud)