在Julia中提取参数类型

Dav*_*ang 7 julia

假设我在Julia中编写了一个函数,它接受一个Dict{K,V}参数,然后创建类型Array{K,1}和的数组Array{V,1}.我怎样才能提取类型K,并V从字典对象,这样我可以用它们来创建阵列?

Ste*_*ski 8

斯文和约翰的答案都很正确.如果您不想像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
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,也有对皮肤这只猫的几种方式,但我认为这eltype(keys(d))eltype(values(d))是迄今最清晰,并且由于keysvalues功能只是返回不变的视图对象,编译器是足够聪明,这实际上并没有创建任何对象.


Joh*_*ite 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}
Run Code Online (Sandbox Code Playgroud)