共用体¶
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
共用体フィールドの型に使用される表記法については、型文法 を参照してください。