跳至内容

联合

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

有关联合字段类型中使用的表示法,请参考 类型语法