CrystalだとCバインディングによってC言語の機能が使えます。
構造体型や共用体も使えたりします。
Union(共用体)について
構造体は身も蓋もない言い方をすると、C++のクラスからメソッド機能を取り払い、デフォルトのアクセサをpublicにしたもの、くらいの認識です。(最近の仕様で変わってるかもしれませんが)
Crystalで構造体と共用体を使用したい場合、以下のドキュメントに従うと
http://ja.crystal-lang.org/docs/syntax_and_semantics/c_bindings/union.html
こんな感じになります。
# char型配列にデータを代入するため
lib C
fun strcpy(s : LibC::Char*, a : LibC::Char*)
end
lib U
# C では:
#
# union Staff {
# int id;
# char name[4];
# };
union Staff
id : Int32
name : LibC::Char[4]
end
end
staff = U::Staff.new
staff.id = 65535
puts staff.name #=> [255,255,0,0]
# 以下は構造体との動作比較
lib C
struct Staff
id : Int32
name : LibC::Char[4]
end
end
staff_ = C::Staff.new
staff_.id = 65535
puts staff_.name #=> [0,0,0,0]
当然ですが、構造体だとメンバ同士はメモリは独立していますが、共用体だとアドレスを共有していることが分かります。
(どういう共用になるかはエンディアン次第)