コンテンツに移動

構造体

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

構造体フィールドの型に使用される表記については、型文法 を参照してください。