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

时间:2015-07-14 20:52:59

标签: types julia abstract-type

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

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

dog = Dog(5.)
typeof(dog)

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

3 个答案:

答案 0 :(得分:9)

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

dogtype(Dog(.5))

然后Float 64会给你eltype

这是用于在Julia基础上实现org.springframework.context.ApplicationListener函数的模式。

答案 1 :(得分:2)

这对我有用:

julia> VERSION
v"0.4.0-dev+5733"

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

julia> dog = Dog(0.5)
Dog{Float64}(0.5)

julia> typeof(dog).parameters[1]
Float64

答案 2 :(得分: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