跳至內容

struct

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

請參閱類型文法,以了解結構欄位類型中使用的符號。