提取Julia中的参数类型

提取Julia中的参数类型,julia,Julia,假设我在Julia中编写了一个函数,它以Dict{K,V}作为参数,然后创建Array{K,1}和Array{V,1}类型的数组。如何从Dict对象中提取类型K和V,以便使用它们创建数组?您可以将键和值与类型结合使用: # an example Dict{K, V} d = Dict{Int64, ASCIIString}() # K typeof(keys(d)) Array{Int64,1} # V typeof(values(d)) Array{ASCIIString,1} 如果要编

假设我在Julia中编写了一个函数,它以
Dict{K,V}
作为参数,然后创建
Array{K,1}
Array{V,1}
类型的数组。如何从Dict对象中提取类型
K
V
,以便使用它们创建数组?

您可以将
类型
结合使用:

# an example Dict{K, V}
d = Dict{Int64, ASCIIString}()

# K
typeof(keys(d))
Array{Int64,1}

# V
typeof(values(d))
Array{ASCIIString,1}

如果要编写一个函数来完成此操作,可以将类型设置为函数的参数,这样可以节省一些运行时查找:

julia> function foo{K, V}(d::Dict{K, V}, n::Integer = 0)
          keyarray = Array(K, n)
          valarray = Array(V, n)
          # MAGIC HAPPENS
          return keyarray, valarray
       end
foo (generic function with 2 methods)

julia> x, y = foo(["a" => 2, "b" => 3])
([],[])

julia> typeof(x)
Array{ASCIIString,1}

julia> typeof(y)
Array{Int64,1}

斯文和约翰的回答都很正确。如果不想像John的代码那样引入方法类型参数,可以使用
eltype
函数:

julia> d = ["foo"=>1, "bar"=>2]
["foo"=>1,"bar"=>2]

julia> eltype(d)
(ASCIIString,Int64)

julia> eltype(d)[1]
ASCIIString (constructor with 1 method)

julia> eltype(d)[2]
Int64

julia> eltype(keys(d))
ASCIIString (constructor with 1 method)

julia> eltype(values(d))
Int64

如您所见,有几种方法可以剥这只猫的皮,但我认为
eltype(key(d))
eltype(values(d))
是迄今为止最清晰的,因为
key
values
函数只返回不可变的视图对象,编译器非常聪明,实际上不会创建任何对象。

如果您对类型感兴趣,可以使用
eltype(d)
,或者定义更具体的函数

keytype{K}(d::Dict{K}) = K
valuetype{K,V}(d::Dict{K,V}) = V
并立即通过

keytype(d)
valuetype(d)

据我所知,这应该是非常有效的,因为编译器可以在编译时推断出其中的大部分

可能值得注意的是,
现在返回迭代器,而不是数组。您需要在较新版本的Julia中添加对
collect
的调用,以获取阵列。谢谢大家。我决定接受这个答案,因为它是最通用的(也适用于其他iterable数据结构)。
eltype(d)
现在返回
Pair{ascistring,Int64}
并且
eltype(d)[1]
不再工作。(Julia v0.4)
keytype
valtype
从v0.4开始内置,分别取代
eltype(d)[1]
eltype(d)[2]
。请注意,从v0.6开始,
eltype(d)[1]MethodError:Cannot`convert`一个Int64类型的对象到一个Pair{String,Int64}
类型的对象,并且从
eltype()
返回的东西是一个
Pair{String,Int}
。这就是说,
eltype(键(d))
仍按预期工作