在Julia中提取参数类型

时间:2014-01-08 09:11:56

标签: julia

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

4 个答案:

答案 0 :(得分:7)

如果您正在编写一个可以为您执行此操作的函数,则可以将类型设置为函数的参数,这可以为您节省一些运行时查找:

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}

答案 1 :(得分:7)

斯文和约翰的答案都很正确。如果您不想像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(keys(d))eltype(values(d))是迄今为止最清晰的,因为keys和{{1函数只返回不可变的视图对象,编译器非常聪明,实际上并不创建任何对象。

答案 2 :(得分:3)

您可以将keysvaluestypeof结合使用:

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

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

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

答案 3 :(得分:2)

如果您只对这些类型感兴趣,可以使用eltype(d),或者定义更具体的功能

keytype{K}(d::Dict{K}) = K
valuetype{K,V}(d::Dict{K,V}) = V

直接通过

找到类型
keytype(d)
valuetype(d)

据我所知,这应该非常有效,因为编译器可以在编译时推断出大部分内容。