Inline const expressions have been stabilised
(github.com)
from SorteKanin@feddit.dk to rust@programming.dev on 25 Apr 2024 12:45
https://feddit.dk/post/5223867
from SorteKanin@feddit.dk to rust@programming.dev on 25 Apr 2024 12:45
https://feddit.dk/post/5223867
threaded - newest
This is a nice small feature. I’m curious about the commit description:
which is roughly desugared into
I would have expected it to desugar to something like:
But I can’t seem an explanation why the struct with
impl
is used. I wonder if it has something to do with propagating generics.It’s because it has to work in pattern contexts as well, which are not expressions.
Wait, in pattern context? How? Can you give an example?
But it looks like
inline_const_pat
is still unstable, onlyinline_const
in expression position is now stabilized.The code they were looking at was used for writing the table, but they were testing the one that read it (which is instead correct).
Yeah that’s me :)The translation using an associated const also works when the
const
block uses generic parameters. For example:This can be written as:
However it cannot be written as:
Because
const FOO: ()
is an item, thus it is only lexically scoped (i.e. visible) insiderequire_zst
, but does not inherit its generics (thus it cannot useT
).Huh, this is awesome! From the link, this now works:
I’m going to have to play with this to see how far it goes.
What I’m curious about - this function was already const, so for stuff like this, I’d think there’s basically a 100% chance the compiler would optimize this too, just implicitly.
AFAIK this new feature is just for times when it isn’t an optimization, but more your own domain invariants. E.g. assertions.
But I could be wrong. I wonder if this can be used for actual optimizations in some places that the compiler couldn’t figure out by itself.
Wouldn’t this just prevent you from allocating more memory (than zero)?
Ah, apparently for now you’re not allowed to allocate. But
vec::new_in(allocator)
looks interesting. This works in nightly today:Maybe at some point I can append to it at compile time too. I’d love to be able to put a
const {}
and have allocations that resolve down to a'static
, and this seems to be a step toward that.I guess I’m just excited that
Vec::new()
is the example they picked, since the next obvious question is, “can I push?”I’m not getting it. What’s the point? It seems very much like a cpp-ism where you can put
const
in so many places.Then there are constant expressions.
Can anybody look at that and tell me it’s readable with a straight face? I hope they don’t start adding all this stuff to rust.
Anti Commercial-AI license
It can be used for producing const values in arbitrary context. Can basically be swapped for c++'s constexpr.
C++'s const does not exist in rust (values are const by default).
Nope. This little neat feature mainly is just necessary part of bigger one - const-generics with const bounds.