Actually add RFC 532

This commit is contained in:
Nick Cameron 2014-12-31 16:03:05 +13:00
parent 40436738b2
commit 1c872b4964
1 changed files with 69 additions and 0 deletions

69
text/0532-self-in-use.md Normal file
View File

@ -0,0 +1,69 @@
- Start Date: 2014-12-19
- RFC PR: [532](https://github.com/rust-lang/rfcs/pull/532)
- Rust Issue: [20361](https://github.com/rust-lang/rust/issues/20361)
# Summary
This RFC proposes the `mod` keyword used to refer
the immediate parent namespace in `use` items (`use a::b::{mod, c}`)
to be changed to `self`.
# Motivation
While this looks fine:
````rust
use a::b::{mod, c};
pub mod a {
pub mod b {
pub type c = ();
}
}
````
This looks strange, since we are not really importing a module:
````rust
use Foo::{mod, Bar, Baz};
enum Foo { Bar, Baz }
````
RFC #168 was written when there was no namespaced `enum`,
therefore the choice of the keyword was suboptimal.
# Detailed design
This RFC simply proposes to use `self` in place of `mod`.
This should amount to one line change to the parser,
possibly with a renaming of relevant AST node (`PathListMod`).
# Drawbacks
`self` is already used to denote a relative path in the `use` item.
While they can be clearly distinguished
(any use of `self` proposed in this RFC will appear inside braces),
this can cause some confusion to beginners.
# Alternatives
Don't do this.
Simply accept that `mod` also acts as a general term for namespaces.
Allow `enum` to be used in place of `mod` when the parent item is `enum`.
This clearly expresses the intent and it doesn't reuse `self`.
However, this is not very future-proof for several reasons.
* Any item acting as a namespace would need a corresponding keyword.
This is backward compatible but cumbersome.
* If such namespace is not defined with an item but only implicitly,
we may not have a suitable keyword to use.
* We currently import all items sharing the same name (e.g. `struct P(Q);`),
with no way of selectively importing one of them by the item type.
An explicit item type in `use` will imply that we *can* selectively import,
while we actually can't.
# Unresolved questions
None.