跳至内容

结构体

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

有关结构体字段类型中使用的符号,请参阅 类型语法