假设我在Julia中编写了一个函数,它接受一个Dict{K,V}参数,然后创建类型Array{K,1}和的数组Array{V,1}.我怎样才能提取类型K,并V从字典对象,这样我可以用它们来创建阵列?
斯文和约翰的答案都很正确.如果您不想像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))是迄今最清晰,并且由于keys和values功能只是返回不变的视图对象,编译器是足够聪明,这实际上并没有创建任何对象.
如果您正在编写一个可以为您执行此操作的函数,则可以将类型设置为函数的参数,这可以为您节省一些运行时查找:
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)