줄리아에서 Dict{K,V}
을 인수로 사용하는 함수를 작성한 다음 Array{K,1}
및 Array{V,1}
유형의 배열을 작성한다고 가정합니다. Dict 객체에서 K
및 V
유형을 추출하여 배열을 만들 때 사용할 수있는 방법은 무엇입니까?Julia에서 매개 변수 유형 추출
답변
스벤과 존의 대답은 모두 옳습니다. 당신이 볼 수 있듯이, 거기에이 고양이를 피부에 몇 가지 방법이 있습니다,하지만 난 생각
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))
은 훨씬 명확하고 keys
및 values
함수는 변경되지 않는 뷰 객체를 반환하기 때문에 컴파일러는 실제로 객체를 만들지 않을 정도로 충분히 똑똑합니다.
당신은 typeof
와 함께 keys
및 values
를 사용할 수 있습니다
# an example Dict{K, V}
d = Dict{Int64, ASCIIString}()
# K
typeof(keys(d))
Array{Int64,1}
# V
typeof(values(d))
Array{ASCIIString,1}
'keys'와'values'가 배열이 아닌 반복자를 반환한다는 사실에 주목할 필요가 있습니다. Julia의 최신 버전에서 배열을 가져 오기 위해'collect'에 대한 호출을 추가해야합니다. –
당신을 위해이 작업을 수행하는 함수를 작성하는 경우, 당신은 유형을 저장할 수있는 함수의 매개 변수를 만들 수 있습니다 몇 가지 런타임 조회 :
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}
당신은, 당신은 eltype(d)
사용하거나 더 많은 특정 기능
keytype{K}(d::Dict{K}) = K
valuetype{K,V}(d::Dict{K,V}) = V
을 정의하고 바로 지금까지 내가 이해
keytype(d)
valuetype(d)
를 통해 유형을 찾을 수 있습니다, 유형에만 관심이 있다면 이것은 컴파일러가 컴파일 타임에 이것의 대부분을 추론 할 수 있기 때문에 매우 효율적이어야합니다.
감사합니다. 가장 일반적인 (반복 가능한 다른 데이터 구조에서도 작동하기 때문에)이 대답을 받아들이기로했습니다. –
'eltype (d)'는 이제'Pair {ASCIIString, Int64}'와'eltype (d) [1]'을 반환하지 않습니다. (Julia v0.4) – colinfang
'keytype'과'valtype'은 v0.4에서 내장되어 있고'eltype (d) [1]'과'eltype (d) [2]'대신 각각 사용합니다 . –