コンテンツにスキップ

共用体

lib 内の union 宣言は、C言語の共用体を宣言します。

lib U
  # In 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::IntOrFloat
value.some_int # => some garbage value

プロパティの設定と取得ができます。

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

代入された値がプロパティの型と完全に同じでない場合、to_unsafe が試行されます。

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

def change_it(value)
  value.some_int = 1
end

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

共用体フィールドの型に使用される表記法については、型文法 を参照してください。