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

Types 如何从julia中泛型类型的实例中提取特定类型?,types,julia,abstract-type,Types,Julia,Abstract Type,如何在julia中获取参数化类型实例的子类型?例如: immutable Dog{T <: Number} snout::T end dog = Dog(5.) typeof(dog) immutable Dog{TNo,因为Dog的类型是Dog{Float64}不是Float64。如果将Dog参数化为一种以上的类型,那么预期的输出将是什么 建议使用方法访问类型/不可变字段: julia> type Foo{T <: Number, S <: Abstract

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

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

dog = Dog(5.)
typeof(dog)

immutable Dog{TNo,因为
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
julia>type Foo{T typeof(Foo)
Foo{Float64,ascistring}
julia>typeof(foo.bar)
浮动64
朱莉娅>类型(foo.baz)
ascistring
julia>用于名称中的字段(Foo)
@eval$(字段)(x::Foo)=x.$字段
结束
朱莉娅>类型(bar(foo))
浮动64
朱莉娅>类型(baz(foo))
ascistring

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

dogtype{T}(::Dog{T}) = T
然后
dogtype(Dog(.5))
将为您提供
Float 64

这是一种用于在base Julia中实现
eltype
函数的模式。

这对我很有用:

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
julia>版本
v“0.4.0-dev+5733”
julia>不可变的狗{T狗=狗(0.5)
狗{Float64}(0.5)
julia>typeof(狗)。参数[1]
浮动64

我不确定您是否想在这里使用“抽象”一词。抽象类型只是类型层次结构中的一个节点,是使用
抽象MyAbstractType
定义的。您的类型
Dog
似乎是参数化的、不可变的和复合的,但不是抽象的。此外,我认为最接近的是
字段类型(Dog,1)
字段类型(dog,:snout)
。我不知道返回参数化类型实例的类型参数的方法(尽管可能存在未记录的类型)。谢谢,我用“参数化”替换了“抽象”一词.是的,我理解--在你的回答中,我的问题是是否有一种方法可以提取酒吧和baz的类型,而无需通过名称来引用它们。user3271788,我认为Toivo Henningsson的回答对你来说是正确的,Tom Breloff的回答符合你的要求,但看起来很粗糙(都是为了不引用标识符?).你的用例是什么?你能用一种语言的例子来扩展你的问题吗?为什么这很有用?