First pass at adding associated constants to the RFC.

This commit is contained in:
Josiah Bills 2024-05-27 12:45:07 -04:00
parent 6d1c8f2ee1
commit 3f17ff8ec8
1 changed files with 23 additions and 3 deletions

View File

@ -6,7 +6,7 @@
# Summary # Summary
[summary]: #summary [summary]: #summary
Allow importing associated functions from traits and then using them like regular functions. Allow importing associated functions and constants from traits and then using them like regular items.
# Motivation # Motivation
[motivation]: #motivation [motivation]: #motivation
@ -15,6 +15,8 @@ There has for a long time been a desire to shorten the duplication needed to acc
Additionally, if you pull in a crate like [num_traits](https://docs.rs/num-traits/latest/num_traits/), then this feature will allow access to numeric functions such as `sin` using the `sin(x)` syntax that is more common in mathematics. More generally, it will make calls to trait associated functions shorter without having to write a wrapper function. Additionally, if you pull in a crate like [num_traits](https://docs.rs/num-traits/latest/num_traits/), then this feature will allow access to numeric functions such as `sin` using the `sin(x)` syntax that is more common in mathematics. More generally, it will make calls to trait associated functions shorter without having to write a wrapper function.
Similarly, associated constants, which act much like constant functions, can be imported to give easier access to them.
# Guide-level explanation # Guide-level explanation
[guide-level-explanation]: #guide-level-explanation [guide-level-explanation]: #guide-level-explanation
@ -108,15 +110,33 @@ fn main() {
} }
``` ```
Importing an associated constant is allowed too:
```rust
mod m {
trait MyNumTrait {
const ZERO: Self;
const ONE: Self;
}
// Impl for every numeric type...
}
use m::MyNumTrait::ZERO;
fn f() -> u32 {
ZERO
}
```
# Reference-level explanation # Reference-level explanation
[reference-level-explanation]: #reference-level-explanation [reference-level-explanation]: #reference-level-explanation
When When
```rust ```rust
use Trait::func as m; use Trait::item as m;
``` ```
occurs, a new item `m` is made available in the value namespace of the current module. Any attempts to call this item are treated as calling the associated function explicitly qualified. As always, the `as` qualifier is optional, in which case the name of the new item is identical with the name of the associated function in the trait. In other words, the example: occurs, a new item `m` is made available in the value namespace of the current module. Any attempts to use this item are treated as using the associated item explicitly qualified. `item` must be either an associated function or an associated constant. As always, the `as` qualifier is optional, in which case the name of the new item is identical with the name of the associated item in the trait. In other words, the example:
```rust ```rust
use Default::default; use Default::default;