结构体¶
在 lib
内的 struct
声明表示声明一个 C 结构体。
lib C
# In C:
#
# struct TimeZone {
# int minutes_west;
# int dst_time;
# };
struct TimeZone
minutes_west : Int32
dst_time : Int32
end
end
您也可以指定多个相同类型的字段。
lib C
struct TimeZone
minutes_west, dst_time : Int32
end
end
递归结构体与您的预期相同。
lib C
struct LinkedListNode
prev, _next : LinkedListNode*
end
struct LinkedList
head : LinkedListNode*
end
end
要创建一个结构体实例,请使用 new
。
tz = C::TimeZone.new
这会在栈上分配结构体。
C 结构体以所有字段设置为“零”开始:整数和浮点数从零开始,指针从零地址开始,等等。
要避免这种初始化,您可以使用 uninitialized
。
tz = uninitialized C::TimeZone
tz.minutes_west # => some garbage value
您可以设置和获取其属性。
tz = C::TimeZone.new
tz.minutes_west = 1
tz.minutes_west # => 1
如果赋值的值与属性的类型不完全相同,则会尝试使用 to_unsafe。
您还可以使用类似于 命名参数 的语法来初始化某些字段。
tz = C::TimeZone.new minutes_west: 1, dst_time: 2
tz.minutes_west # => 1
tz.dst_time # => 2
C 结构体按值(作为副本)传递给函数和方法,并在从方法返回时也按值传递。
def change_it(tz)
tz.minutes_west = 1
end
tz = C::TimeZone.new
change_it tz
tz.minutes_west # => 0
有关结构体字段类型中使用的符号,请参阅 类型语法。