跳到內容

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

請參閱類型文法以取得聯合欄位類型中使用的表示法。