私は小さなインタプリタで作業しています。構造体の残りのためのタグとしてランタイムで定義されたメンバでタグ付きの共用体
enum {
NIL_TYPE,
INT_TYPE,
REF_TYPE_START,
}
union Data
{
int int_val;
void *obj_val
}
struct Object
{
size_t _type_id;
Data _data;
}
_type_id
行為:ここでは、C++で次のようになります。 integer、boolean、nilsなどのものはスタックに渡すことができますが、文字列やオブジェクトなどの大きなものは参照渡しできます。
インタープリタは、実行時にREF_START_TYPE
の新しい型を作成します。新しいタイプが作成されると、ある内部カウンタに値を追加し、次のタイプのIDになり、そのタイプがポインタであると予想されます。
どうすればRustでこれを表現できますか?列挙型はすばらしいようですが、拡張を許可していないようです。タグなし組合は非常にWIPで、あまり役に立たないようです。実行時の拡張を可能にしながら、このようなオンスタック動作を得ることができます(これにより、数学演算中の割り当て量を削減できます)。あなたはあなたがRuntimeType
はポインタのみが含まれていることを確認か、すぐにそれをボックスに(Runtime(TypeId, Box<RuntimeType>),
)を選択することができ
enum Object {
Nil,
Int(i32),
Runtime(TypeId, RuntimeType),
}
ような何かをしたいが、同じ最終結果を持っているよう
Cは、いずれかの組合の種類のランタイム拡張をサポートしていないので、私はここでの問題は本当に錆固有ではないと思います。しかし、あなたが避けようとしている配分であれば、 https://doc.rust-lang.org/nomicon/exotic-sizes.html –