联合¶
在 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
有关联合字段类型中使用的表示法,请参考 类型语法。