2016-03-02 107 views
3

假設我定義類型一樣,獲取的參數類型的參數

type Point{Tx, Ty} end 

然後,我創建這種類型的變量,例如,現在

a = Point{Int64, :something}() 

,我只知道我可以通過typeof(a)得到a的類型。那就是,Point{Int64, :something}。 但是,我需要的僅僅是參數TxTy

有什麼方法可以得到這些參數TxTy

回答

1

typeof(a)是一個DataType它有很多領域。你可以通過讓這些名字:

julia> fieldnames(DataType) 
10-element Array{Symbol,1}: 
:name   
:super  
:parameters 
:types  
:instance  
:size   
:abstract  
:mutable  
:pointerfree 
:ninitialized 

所以如果你需要這些參數,運行

julia> collect(typeof(a).parameters) 
2-element Array{Any,1}: 
Int64  
:something 
4

您可以定義一個函數如下

eltypes{Tx,Ty}(::Type{Point{Tx, Ty}}) = (Tx, Ty) 
eltypes(p) = eltypes(typeof(p)) 

(這裏::Type{Point{Tx, Ty}}匹配的參數類型Point{Tx, Ty})並使用它

julia> eltypes(Point{Int, Float64}()) 
(Int64,Float64) 

這是一個常用的習慣用法,例如在Base中有類似的功能

eltype{T}(::Type{Set{T}}) = T 
eltype(x) = eltype(typeof(x))