2016-07-12 3 views
4

Kann ich eine Instanz eines Werttyps in Julia haben?Instanz des Werttyps in Julia

Als ich versuchte, isa(3, Val{3}) an der REPL-Konsole einzugeben, wird false zurückgegeben.

Also was gibt mir three = Val{3}()?

Antwort

7

Wie Sie beobachtet haben, ist es in der Tat möglich, Instanzen von Val Typen zu erstellen, aber sie haben wenig Beziehung zu den "Werten", aus denen Sie sie konstruieren. Zum Beispiel

julia> 3 == Val{3}() 
false 

Val Typen (oder Val Instanzen) haben wirklich nur ein Ziel: Informationen zu Julias Compiler zu übergeben, die Typen aber (in der Regel) nicht Instanzen sieht. Zum Beispiel können Sie nicht auf eine ganze Zahl von einem bestimmten Wert versenden:

julia> check_for_three(x::Int) = false 
check_for_three (generic function with 1 method) 

julia> check_for_three(x::3) = true 
ERROR: ArgumentError: invalid type for argument x in method definition for check_for_three at REPL[3]:1 
in eval(::Module, ::Any) at ./boot.jl:234 
in macro expansion at ./REPL.jl:92 [inlined] 
in (::Base.REPL.##1#2{Base.REPL.REPLBackend})() at ./event.jl:46 

Sie können jedoch Versand auf einem Val Typ:

julia> check_for_three_val{N}(::Val{N}) = false 
check_for_three_val (generic function with 1 method) 

julia> check_for_three_val(::Val{3}) = true 
check_for_three_val (generic function with 2 methods) 

julia> check_for_three_val(Val{2}()) 
false 

julia> check_for_three_val(Val{3}()) 
true 

Sie können mit dem gleichen Code-Typen schreiben, anstatt Instanzen:

julia> check_for_three_valtype{N}(::Type{Val{N}}) = false 
check_for_three_valtype (generic function with 1 method) 

julia> check_for_three_valtype(::Type{Val{3}}) = true 
check_for_three_valtype (generic function with 2 methods) 

julia> check_for_three_valtype(Val{2}) 
false 

julia> check_for_three_valtype(Val{3}) 
true 

letztere ein wenig härter auf Ihrer Funktion-Autor ist aber ein wenig leichter auf den Anrufer (Sie, dass Type{} eintippen) (Sie können dieüberspringen). Die allgemeine Übereinkunft besteht darin, das letztere zu übernehmen, um für den Anrufer netter zu sein, aber das ist nur eine Konvention; entweder könnte gewählt werden.

Schließlich ist Val ein Spaß Trick, und manchmal kann es verwendet werden, um Leistungsprobleme zu lösen, aber es ist auch leicht zu missverstehen und in der Tat machen die Leistung schlechter. Sehen Sie diese Abschnitte des Handbuchs

+0

Dank @tholy. Wenn ich richtig verstehe, sind der Typ 'Val {3}' und eine Instanz 'Val {3}()' zur Laufzeit nutzlos? Werden die oben genannten Funktionen zur Kompilierzeit ausgewertet? –

+1

Das ist richtig, ihr Zweck ist die Auswertung der Kompilierzeit. Deshalb macht der Übergang zwischen der Welt der (wahren) Werte und "Val" keinen Sinn; Da der Compiler keine echten Werte vorhersagen kann, verlieren Sie alle potenziellen Vorteile der Kompilierzeitauswertung. – tholy