ジュリアでのシンボル
概要
Juliaに初めて接すると、戸惑うことも少なくないのがシンボルsymbolデータタイプである。シンボルは冒頭に:
を付けて使用され、内部データなしにその名前そのもので機能する。主に名前やラベル、辞書のキーなどとして使われる1。
説明
他のプログラミング言語では、関数にオプションを付ける時に数字を使ったり、意味を正確にするために文字列を使用することが多い。例えば、次の二つの関数がそうである。
julia> function foo0(x, option = 0)
if option == 0
return string(x)
elseif option == 1
return Int(x)
else
error("wrong")
end
end
foo0 (generic function with 2 methods)
julia> foo0(3.0, 0)
"3.0"
julia> foo0(3.0, 1)
3
julia> function foo1(x, option = "string")
if option == "string"
return string(x)
elseif option == "Int"
return Int(x)
else
error("wrong")
end
end
foo1 (generic function with 2 methods)
julia> foo1(3.0, "string")
"3.0"
julia> foo1(3.0, "Int")
3
その一方で、以下はシンボルを使用した定義である。一見すると、上記の二つの関数と違いがないように見える。
julia> function foo2(x, option = :string)
if option == :string
return string(x)
elseif option == :Int
return Int(x)
else
error("wrong")
end
end
foo2 (generic function with 2 methods)
julia> foo2(3.0, :string)
"3.0"
julia> foo2(3.0, :Int)
3
シンボルを使用する理由は、プログラムの途中で変更されることがないから簡単に説明できる。時にはこの点が不便と感じることもあるが、整数や文字列とは異なり、予期せぬところで変化する可能性が全くない。
また、シンボルは真の意味での指定、命令である。インターフェース的な観点では、文字列とシンボルは似ているが、例えば"Int"
という文字列を受け取り、その文字列が整数を返す意味であるのに対し、シンボルが:Int
として直接来た場合は、質問もせずに整数型で返すという程度の違いである。この違いが理解できなくても、無理に共感する必要はない。
その他、シンボルを使用する場合には、データフレームのカラム名など、文字列で表現すると変数と区別しにくい、または区別したくない場合などがある。慣れない表記法のため難しく感じるかもしれないが、用途と違いを理解すれば、特に問題はないという点を押さえておけば良い。