Juliaに値型のインスタンスを持たせることはできますか?Juliaの値型のインスタンス
REPLコンソールでisa(3, Val{3})
と入力すると、false
が返されます。
だからthree = Val{3}()
は私に何を与えるのですか?
Juliaに値型のインスタンスを持たせることはできますか?Juliaの値型のインスタンス
REPLコンソールでisa(3, Val{3})
と入力すると、false
が返されます。
だからthree = Val{3}()
は私に何を与えるのですか?
ご覧のとおり、実際には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マニュアル
感謝のこれらのセクションを参照してください。私が正しく理解するならば、 'Val {3}'型と 'Val {3}()'インスタンスは実行時に役に立たないのですか?上記の関数はコンパイル時に評価されていますか? –
そうです、その目的はコンパイル時の評価です。だから、(本当の)価値観と「Val」の世界の間の移行は理にかなっていない。コンパイラは真の値を予測できないため、コンパイル時の評価の潜在的な利点をすべて失います。 – tholy