2016-07-12 5 views
4

Juliaに値型のインスタンスを持たせることはできますか?Juliaの値型のインスタンス

REPLコンソールでisa(3, Val{3})と入力すると、falseが返されます。

だからthree = Val{3}()は私に何を与えるのですか?

答えて

7

ご覧のとおり、実際にはValタイプのインスタンスを作成することはできますが、それらのインスタンスを作成する「値」とはほとんど関係がありません。例えば、

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

Valタイプ(またはValインスタンス)本当に唯一の目的を持っている:タイプを見ているが、(一般的に)これは、ジュリアのコンパイラに情報を渡すことではないのインスタンス。たとえば、特定の値の整数に発送することはできません。

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 

しかし、あなたはValタイプに派遣することができます:あなたはタイプを使用してではなく、同じコードを書くことができ

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 

インスタンス:

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 

後者は(あなたがそのType{}を入力する必要が)あなたの関数-作者に少し難しいですが、呼び出し側に少し楽(あなたは0123をスキップすることができます)。一般的なコンベンションでは、後者を呼び出し側の方に向けるように採用していますが、これは単なるコンベンションです。いずれかを選択することができます。

最後に、Valは楽しいトリックですが、パフォーマンスの問題を解決するために使用することもできますが、それを誤解して実際にパフォーマンスを悪化させることもあります。 @tholyマニュアル

+0

感謝のこれらのセクションを参照してください。私が正しく理解するならば、 'Val {3}'型と 'Val {3}()'インスタンスは実行時に役に立たないのですか?上記の関数はコンパイル時に評価されていますか? –

+1

そうです、その目的はコンパイル時の評価です。だから、(本当の)価値観と「Val」の世界の間の移行は理にかなっていない。コンパイラは真の値を予測できないため、コンパイル時の評価の潜在的な利点をすべて失います。 – tholy

関連する問題