logo

ジュリアでのシンボル 📂ジュリア

ジュリアでのシンボル

概要

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として直接来た場合は、質問もせずに整数型で返すという程度の違いである。この違いが理解できなくても、無理に共感する必要はない。

その他、シンボルを使用する場合には、データフレームのカラム名など、文字列で表現すると変数と区別しにくい、または区別したくない場合などがある。慣れない表記法のため難しく感じるかもしれないが、用途と違いを理解すれば、特に問題はないという点を押さえておけば良い。