2015-07-14 12 views
6

Jak uzyskać podtyp instancji typu parametrycznego w julia? Na przykład:Jak wyodrębnić określony typ z instancji typu ogólnego w julia?

immutable Dog{T <: Number} 
    snout::T 
end 

dog = Dog(5.) 
typeof(dog) 

... zwraca Dog{Float64}. Czy istnieje sposób uzyskania typu Float64 ze zmiennej dog bez bezpośredniego odwoływania się do pola snout?

+0

nie jestem pewien, to znaczy używać słowa „biznes” tutaj. Typ abstrakcyjny jest po prostu węzłem w hierarchii typów i jest definiowany za pomocą 'abstract MyAbstractType'. Twój typ "Pies" wydaje się parametryczny, niezmienny i złożony, ale * nie * abstrakcyjny. –

+1

Sądzę również, że najbliżej otrzymasz: 'fieldtype (pies, 1)' lub 'fieldtype (pies,: pysk)'. Nie znam metody zwracania parametru typu instancji typu parametrycznego (chociaż możliwe jest, że istnieje nieudokumentowana). –

+0

Dziękuję, zamieniłem słowo "abstract" na "parametryczny". – user3271788

Odpowiedz

1

Nie, ponieważ typ dog jest Dog{Float64}nieFloat64. Pomyśl o oczekiwanym wyjściu, jeśli parametryzujesz Dog przez więcej niż jeden typ.

Zalecanym sposobem jest użycie metody dostępu rodzajem Pola/niezmienne:

julia> type Foo{T <: Number, S <: AbstractString} 
      bar::T 
      baz::S 
     end 

julia> foo = Foo(5.5, "test") 
Foo{Float64,ASCIIString}(5.5,"test") 

julia> typeof(foo) 
Foo{Float64,ASCIIString} 

julia> typeof(foo.bar) 
Float64 

julia> typeof(foo.baz) 
ASCIIString 

julia> for field in names(Foo) 
      @eval $(field)(x::Foo) = x.$field 
     end 

julia> typeof(bar(foo)) 
Float64 

julia> typeof(baz(foo)) 
ASCIIString 
+0

Tak, rozumiem to - moje pytanie w kontekście twojej odpowiedzi brzmi, czy istnieje sposób na wyodrębnienie rodzajów baru i baz bez odwoływania się do nich po imieniu. – user3271788

+0

user3271788, myślę, że odpowiedź Toivo Henningssona jest odpowiednia dla ciebie, odpowiedź Toma Breloffa robi to, co chcesz, ale wygląda na hacky (wszystko ze względu na brak odniesienia do identyfikatora?). Jaki jest twój przypadek użycia? Czy możesz rozwinąć swoje pytanie na przykładzie języka, który pozwala ci to zrobić i dlaczego jest to przydatne? – SalchiPapa

9

To zależy od przypadku użycia. Jeśli jesteś zainteresowany konkretnym przypadku jak ten, dobrym sposobem jest zdefiniować funkcję

dogtype{T}(::Dog{T}) = T 

Następnie dogtype(Dog(.5)) daje Float 64.

Jest to rodzaj wzoru używanego do implementacji funkcji eltype w bazie Julia.

2

Działa to dla mnie:

julia> VERSION 
v"0.4.0-dev+5733" 

julia> immutable Dog{T <: Number} 
      snout::T 
     end 

julia> dog = Dog(0.5) 
Dog{Float64}(0.5) 

julia> typeof(dog).parameters[1] 
Float64 
Powiązane problemy