我正在研究一個小解釋器,我想在其他人指針的情況下表示堆棧上的某些類型。下面是它看起來像在C++:使用運行時定義的成員標記的工會
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
充當結構的其餘部分的標籤。諸如整數,布爾值,nils等的東西可以在堆棧上傳遞,而大的東西如字符串和對象可以通過引用傳遞。
解釋器將在運行時創建新類型,這是REF_START_TYPE
的用途。當創建一個新類型時,我們會向某個內部計數器添加一個值,並且該值將成爲下一個類型標識,並且該類型應該是一個指針。
如何在Rust中表示這樣的內容?枚舉類型看起來很棒,但它們似乎不允許擴展。無標籤的工會似乎是一個在製品,並沒有太大的幫助。有什麼辦法可以獲得這種堆棧行爲(從而減少數學運算期間的大量分配),同時仍允許運行時擴展?
C不支持聯合類型的運行時擴展要麼,所以我不認爲這裏的問題是真正的防鏽專用。但是如果你想避免的是分配,請看例如https://doc.rust-lang.org/nomicon/exotic-sizes.html –