プログラミング言語 Crystal

Crystal の日本語ドキュメントはしばらく更新されておらず情報が古くなっているため、できるだけ原文の英語ドキュメントで最新の情報を参照ください。

翻訳にご協力いただける方は翻訳プロジェクトの issue や Crystal-JP の Slack からお知らせください。

共用体 (union)

lib の内部で union を宣言することで C の共用体を宣言できます。

lib U
  # C では:
  #
  #  union IntOrFloat {
  #    int some_int;
  #    double some_float;
  #  };
  union IntOrFloat
    some_int : Int32
    some_float : Float64
  end
end

共用体のインスタンスを生成するには new を利用します。

value = U::IntOrFloat.new

これによって、スタックに共用体が割り当てられます。

C の共用体は、初期状態として、すべての値が「ゼロ」の状態になります。つまり、整数と浮動小数点数はゼロで、ポインタはゼロのアドレスを指している、などの状態です。

このように初期化されることを避けたい場合は、uninitialized を利用します。

value = uninitialized U::IntOrFlaot
value.some_int #=> 何かゴミの値

プロパティの設定、および参照が可能です。

value = U::IntOrFloat.new
value.some_int = 1
value.some_int #=> 1
value.some_float #=> 4.94066e-324

C の共用体は関数やメソッドに (コピーとして) 値渡しされます。また、メソッドから返るときも値で渡されます。

def change_it(value)
  value.some_int = 1
end

value = U::IntOrFloat.new
change_it value
value.some_int #=> 0

共用体のフィールドに使用可能な型の指定方法については型文法を参照してください。