2014-01-08 2 views
6

줄리아에서 Dict{K,V}을 인수로 사용하는 함수를 작성한 다음 Array{K,1}Array{V,1} 유형의 배열을 작성한다고 가정합니다. Dict 객체에서 KV 유형을 추출하여 배열을 만들 때 사용할 수있는 방법은 무엇입니까?Julia에서 매개 변수 유형 추출

답변

6

스벤과 존의 대답은 모두 옳습니다. 당신이 볼 수 있듯이, 거기에이 고양이를 피부에 몇 가지 방법이 있습니다,하지만 난 생각

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 기능을 사용할 수 있습니다 eltype(keys(d))eltype(values(d))은 훨씬 명확하고 keysvalues 함수는 변경되지 않는 뷰 객체를 반환하기 때문에 컴파일러는 실제로 객체를 만들지 않을 정도로 충분히 똑똑합니다.

+0

감사합니다. 가장 일반적인 (반복 가능한 다른 데이터 구조에서도 작동하기 때문에)이 대답을 받아들이기로했습니다. –

+0

'eltype (d)'는 이제'Pair {ASCIIString, Int64}'와'eltype (d) [1]'을 반환하지 않습니다. (Julia v0.4) – colinfang

+0

'keytype'과'valtype'은 v0.4에서 내장되어 있고'eltype (d) [1]'과'eltype (d) [2]'대신 각각 사용합니다 . –

3

당신은 typeof와 함께 keysvalues를 사용할 수 있습니다

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

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

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

'keys'와'values'가 배열이 아닌 반복자를 반환한다는 사실에 주목할 필요가 있습니다. Julia의 최신 버전에서 배열을 가져 오기 위해'collect'에 대한 호출을 추가해야합니다. –

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} 
2

당신은, 당신은 eltype(d) 사용하거나 더 많은 특정 기능

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

을 정의하고 바로 지금까지 내가 이해

keytype(d) 
valuetype(d) 

를 통해 유형을 찾을 수 있습니다, 유형에만 관심이 있다면 이것은 컴파일러가 컴파일 타임에 이것의 대부분을 추론 할 수 있기 때문에 매우 효율적이어야합니다.