(no title)
tiehuis | 7 years ago
Sure. I think that's more an effect of the choice of keyword defaults here. A straight union is very uncommon and is typically solely for C interoperability.
> And the "more powerful" is about the fact that a Rust enum can actually carry data, while it doesn't seem to be the case with Zig.
A tagged union can store data as in Rust. See the examples in the documentation [1]. Admittedly Rust's pattern matching is nicer to work with here.
To summarise the concepts:
- `enum` is a straight enumeration with no payload. The backing tag type can be specified (e.g. enum(u2)).
- `union` is an unchecked sum type, similar to a c union without a tag field.
- `union(TagType)` is a sum type with a tag field, analagous to a Rust enum . A `union(enum)` is simply shorthand to infer the underlying TagType.
> So, it sounds like deallocations are not checked by default, right?
If referring to if objects are guaranteed to be deallocated when out of scope then no, this isn't checked. There are a few active issues regarding some improvements to resource management but it probably won't result in any automatic RAII-like functionality. This is a manual step using defer right now.
Yoric|7 years ago
Fair enough. That's why Rust also has a `union` keyword, which is always `unsafe`.
> A tagged union can store data as in Rust. See the examples in the documentation [1]. Admittedly Rust's pattern matching is nicer to work with here.
Ah, right, it could be any struct instead of being a bool or integer. I missed that.
> If referring to if objects are guaranteed to be deallocated when out of scope then no, this isn't checked.
I was wondering about that and double-deallocations.
> There are a few active issues regarding some improvements to resource management but it probably won't result in any automatic RAII-like functionality.
Out of curiosity, what kind of improvements?
AnIdiotOnTheNet|7 years ago
My understanding was that Zig unions are tagged, but if you don't explicitly specify the tag type the compiler will choose for you. Indeed, the first example in the documentation suggests normal unions are tagged:
Or do straight unions only get a hidden tag for debug/safe builds? My memory is a little fuzzy.