struct
Une déclaration struct
dans une lib
déclare une struct C.
lib C
# En C:
#
# struct TimeZone {
# int minutes_west;
# int dst_time;
# };
struct TimeZone
minutes_west : Int32
dst_time : Int32
end
end
Vous pouvez aussi spécifier plusieurs champs de même type:
lib C
struct TimeZone
minutes_west, dst_time : Int32
end
end
Les structs récursives ont un fonctionnement sans surprise:
lib C
struct LinkedListNode
prev, _next : LinkedListNode*
end
struct LinkedList
head : LinkedListNode*
end
end
Pour créer une instance d'une struct utilisez new
:
tz = C::TimeZone.new
Cela alloue la struct sur la pile.
Une struct C démarre avec tous ses champs à "zéro": entiers et flottants démarrent à zéro, pointeurs démarrent avec une adresse à zéro, etc.
Pour éviter cette initialisation vous pouvez utiliser uninitialized
:
tz = uninitialized C::TimeZone
tz.minutes_west #=> some garbage value
Vous pouvez modifier et accéder à ces propriétés:
tz = C::TimeZone.new
tz.minutes_west = 1
tz.minutes_west #=> 1
Si la valeur affectée n'est pas exactement la même que le type de la propriété, to_unsafe sera essayé.
Vous pouvez aussi initialiser certains champs avec une syntaxe similaire aux arguments nommés:
tz = C::TimeZone.new minutes_west: 1, dst_time: 2
tz.minutes_west #=> 1
tz.dst_time #=> 2
Une struct C est passée par valeur (en tant que copie) aux fonctions et méthodes, et aussi passée par valeur quand retournée par méthode:
def change_it(tz)
tz.minutes_west = 1
end
tz = C::TimeZone.new
change_it tz
tz.minutes_west #=> 0
Reportez-vous à la grammaire de type pour la notation utilisée dans les types de champs de struct.