2016-06-14 8 views
3

私はジュリアのヒストグラムの辞書をたくさん作成しました。キーは、オブジェクトを返すへの単純な呼び出しとして、4つの要素の整数配列です:なぜジュリアは辞書に#undefキーを生成するのですか?

In[88] Histogramas 
Out[88] Dict{Array{Int64,N},Array{T,N}} with 36540 entries: 
    [56,8,39,55] => [0,2,4,7,19,44,61,76,124,116 … 0,0,0,0,0,0,0,0,0,0] 
    [64,20,48,55] => [284,368,202,106,35,3,2,0,0,0 … 0,0,0,0,0,0,0,0,0,0] 
    [54,9,50,54] => [0,0,0,0,0,0,0,0,0,2 … 1,0,0,0,0,0,0,0,0,0] 
    [37,26,45,61] => [0,6,11,35,47,86,113,133,136,139 … 0,0,0,0,0,0,0,0,0,0] 
    [37,15,51,50] => [673,272,48,5,2,0,0,0,0,0 … 0,0,0,0,0,0,0,0,0,0] 
    [35,22,53,45] => [331,370,201,69,25,4,0,0,0,0 … 0,0,0,0,0,0,0,0,0,0] 
    [37,25,56,40] => [460,382,127,27,3,0,1,0,0,0 … 0,0,0,0,0,0,0,0,0,0] 
.... 

しかし、私はHistogramas.keysを呼び出す場合、私はこの非常に奇妙な出力が得られます。

Out[90] : 65536-element Array{Array{Int64,N},1}: 
#undef   
#undef   
    [56,8,39,55] 
#undef   
    [64,20,48,55] 
    [54,9,50,54] 
#undef   
    [37,26,45,61] 
    [37,15,51,50] 
... 

だから私は、ほぼ倍のキーを得ました余分なもののほとんどは#undefです。ところで、私はその意味がわかりません。 ¿どの意味で定義されていませんか?

答えて

6

これはDictのキーを取得する正しい方法ではありません。あなたは誤ってDictオブジェクトのプライベート内部フィールドにアクセスしています。 Dictのキーにアクセスするための正しい方法はDictオブジェクト上keys関数を呼び出すことである。

julia> d = Dict(:foo => 1.2, :bar => 2.3, :baz => 3.4) 
Dict{Symbol,Float64} with 3 entries: 
    :bar => 2.3 
    :baz => 3.4 
    :foo => 1.2 

julia> keys(d) 
Base.KeyIterator for a Dict{Symbol,Float64} with 3 entries. Keys: 
    :bar 
    :baz 
    :foo 
#undef

出力アレイの表示アレイに初期化されていないエントリを示しています。これは、nullのC、C++、Javaの値に似ていますが、nullとは異なり、Julia #undefは非ファーストクラスです。使用できる値ではありません。定義されていないフィールドまたは配列スロットの使用は、即時例外です。一般的に

、ジュリアは「ドット指向言語」ではありません:PythonやJavaで、あなたはobjfrobにアクセスしたり、objをfrizzleするobj.frizzle()を行うにを行うことを期待するかもしれないのに対し、ジュリアに右ではないようですやるべき事。あなたはおそらくfrob(obj)frizzle(obj)を代わりに実行します。

+0

そして、ドット表記法は、ジュリアで何を使用していますか?多くのおかげで、ステファン、あなたはいつも私の質問に答えています! – wpkzz

+0

ドット表記は、リテラルフィールドアクセスの場合のみです。それが過負荷になることを許可する議論がありましたが、それはまだ起こっていません。 – StefanKarpinski

関連する問題