union¶
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
請參閱類型文法以取得聯合欄位類型中使用的表示法。