1
0
mirror of https://github.com/google/comprehensive-rust.git synced 2024-12-04 03:25:08 +02:00

Added notes, runtime constant eval, and footnoes to static-and-const.md

This commit is contained in:
Brandon Pollack 2023-01-10 13:41:31 +09:00
parent bee9cdab92
commit 89ddb2c197

View File

@ -24,6 +24,8 @@ fn main() {
}
```
According the the [Rust RFC Book][1] these are inlined upon use.
## `static`
You can also declare static variables:
@ -36,4 +38,23 @@ fn main() {
}
```
As noted in the [Rust RFC Book][1], these are not inlined upon use and have an actual associated memory location. This is useful for unsafe and embedded code, and have a `'static` lifetime[^lifetime].
We will look at mutating static data in the [chapter on Unsafe Rust](../unsafe.md).
## Runtime evaluated constants
Sometimes you want a global constant that isn't constructable at compile time, such as a global HashMap or complex structure. This is done with crates like [OnceCell](https://crates.io/crates/once_cell) or [lazy_static](https://crates.io/crates/lazy_static).
[1]: https://rust-lang.github.io/rfcs/0246-const-vs-static.html
[^lifetime]: We'll discuss lifetimes later today in the section on ownership
<details>
* If the target audience is well versed in C++, it might be helpful to mention that `const` behaves semantically similar to C++'s `constexpr`
* `static`, on the other hand, is much more similar to a `const` or mutable global variable.
* It isn't super common that one would need a runtime evaluated constant, but it is helpful and safer than using a static.
</details>