假设我在 Julia 中编写了一个以 aDict{K,V}
作为参数的函数,然后创建类型为Array{K,1}
and的数组Array{V,1}
。如何从 Dict 对象中提取类型K
和类型,V
以便可以使用它们来创建数组?
问问题
4304 次
4 回答
9
斯文和约翰的回答都非常正确。如果不想像 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))
andeltype(values(d))
是迄今为止最清晰的,因为keys
andvalues
函数只返回不可变的视图对象,编译器足够聪明,它实际上不会创建任何对象.
于 2014-01-08T16:15:19.923 回答
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}
于 2014-01-08T15:59:35.313 回答
3
您可以使用keys
和values
结合typeof
:
# an example Dict{K, V}
d = Dict{Int64, ASCIIString}()
# K
typeof(keys(d))
Array{Int64,1}
# V
typeof(values(d))
Array{ASCIIString,1}
于 2014-01-08T13:35:06.707 回答
2
如果您只对类型感兴趣,您可以使用eltype(d)
,或定义更具体的函数
keytype{K}(d::Dict{K}) = K
valuetype{K,V}(d::Dict{K,V}) = V
并立即通过
keytype(d)
valuetype(d)
据我了解,这应该非常有效,因为编译器可以在编译时推断出大部分。
于 2014-11-26T08:20:45.040 回答