union

Une déclaration union dans une lib déclare une union C:

lib U
  # In C:
  #
  #  union IntOrFloat {
  #    int some_int;
  #    double some_float;
  #  };
  union IntOrFloat
    some_int : Int32
    some_float : Float64
  end
end

Pour créer une instance d'une union on utilise new:

value = U::IntOrFloat.new

Cela alloue une union sur la pile.

Une union 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:

value = uninitialized U::IntOrFloat
value.some_int #=> some garbage value

Vous pouvez définir et accéder à ses propriétés:

value = U::IntOrFloat.new
value.some_int = 1
value.some_int #=> 1
value.some_float #=> 4.94066e-324

Si la valeur affectée n'est pas exactement celle du type de la propriété, to_unsafe sera essayée.

Une union C est passée par valeur (par copie) aux fonctions et méthodes, et aussi passée par valeur quand elle est retournée d'une méthode:

def change_it(value)
  value.some_int = 1
end

value = U::IntOrFloat.new
change_it value
value.some_int #=> 0

Reportez-vous à la grammaire de type pour la notation utilisée dans les types des champs de l'union.

results matching ""

    No results matching ""