-
Notifications
You must be signed in to change notification settings - Fork 459
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add details on how names are introduced. #1052
base: master
Are you sure you want to change the base?
Conversation
src/items/enumerations.md
Outdated
@@ -61,6 +62,27 @@ integer associated to it that is used to determine which variant it holds. An | |||
opaque reference to this discriminant can be obtained with the | |||
[`mem::discriminant`] function. | |||
|
|||
Variant constructors are similar to [struct] definitions, and can be referenced by a path from the enumeration name, including in [use declarations]. | |||
The constructors are defined in both the [type namespace] and [value namespace] within the enumeration. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
"Constructor" typically refers only to the value namespace component.
The type namespace component is a "variant itself", or a "variant type" when rust-lang/rfcs#2593 gets implemented.
(It's unfortunate that that RFC is postponed because it cannot decide how to construct values of variant types better, which is an entirely orthogonal question to introducing variant types themselves, at least in theory.)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can you clarify something here? The tuple-struct constructor in the value namespace doesn't currently have much of a purpose, does it? At least, I can't think of a way it could be used. The only thing I noticed is that you are not allowed to shadow it, as in:
enum E {
V1 {f1: i32}
}
fn foo() {
use E::*;
let V1 = 123; // ERROR: let bindings cannot shadow struct variants
}
Thanks so much for the review, I do appreciate it! |
This is just a first pass to specifying how each thing introduces a name, and where it is introduced. This is missing `use` and `Self`. (And a few things I don't feel like need elaboration, like loop labels, but those can be added if desired.)
Since "namespace" has a specific meaning in Rust, I feel like it would be good not to overload it too much with the sense of a scope container like a C++ namespace.
This attempts to update the `use` chapter to explain the kinds of paths and syntax it supports in more detail. This is not an exhaustive explanation of resolution, and there are several things it does not cover.
This was changed in rust-lang/rust#56414 to favor in-scope items.
@traviscross I have rebased, and pushed a small fix for this. I'm not certain what else has changed or is missing since it was written, though. I though I had some additional notes somewhere, and if I find them I'll follow up later. |
We've merged PR rust-lang#1040, so we can remove the TODO and update the link to point to the specific section. We replace some commas with semicolons where that's the right thing to do grammatically. Where we have "an X is... they are...", we replace that with "an X is... Xs are..." for reasons of avoiding a mismatch between the plurality of the pronoun and its referent. We replace "implementing type" and "defining type" with "type being implemented" and "type being defined", since there is in general a difference (e.g. "the driving force" vs "the force being driven"), and these seem more like the latter than the former. There's a place where we had said, "glob imports are allowed to import conflicting names into the same *namespaces*" (emphasis added). It makes sense what this is trying to say by using the plural there. But it just reads better to use the singular, and if it's true for the singular, it's clearly also true to the plural, so we make that change.
We had mentioned and demonstrated that a name is allowed to be redundantly imported by multiple glob imports, but we hadn't said that it is allowed to then be *used*. Given the example that directly proceeds this, it seems important to make a note of that, so let's do that, and let's extend the example to demonstrate this.
The claim here was that: > Glob imports are allowed to import conflicting names in the same > namespace as long as the name is not used *or shadowed*. It's true that the name being used will cause an error. But it's not true that the name being shadowed will cause one, so let's remove that part.
It's a bit more common throughout the Reference, including even within this PR, to say "For example:" rather than just "Example:", and it's more grammatically regular, so let's fix up the ones that went the other way in this branch.
ec2ba63
to
9b79976
Compare
This expands on several sections to specify exactly which names are introduced by items. This also contains a few tangential updates, such as explaining what
Self
is and how it is defined, and a major update to theuse
chapter.This does not cover everything; that's a multi-year effort. This is intended as a small step along that journey. One giant gaping hole is covering expansion and peculiarities related to that. The ambiguities section is also incomplete.
Closes #129
cc #487
cc #568