mirror of https://github.com/rust-lang/rfcs.git
Actually add RFC 532
This commit is contained in:
parent
40436738b2
commit
1c872b4964
|
@ -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.
|
Loading…
Reference in New Issue