about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--doc/rust.md38
1 files changed, 37 insertions, 1 deletions
diff --git a/doc/rust.md b/doc/rust.md
index d93670a5638..6ae38b07db2 100644
--- a/doc/rust.md
+++ b/doc/rust.md
@@ -761,7 +761,9 @@ fn main() {
 ##### Export declarations
 
 ~~~~~~~~ {.ebnf .gram}
-export_decl : "export" ident [ ',' ident ] * ;
+export_decl : "export" ident [ ',' ident ] * 
+            | "export" ident "::{}"
+            | "export" ident '{' ident [ ',' ident ] * '}' ;
 ~~~~~~~~
 
 An _export declaration_ restricts the set of local names within a module that
@@ -813,6 +815,40 @@ mod foo {
 }
 ~~~~~~~~
 
+When exporting the name of an `enum` type `t`, by default, the module also
+implicitly exports all of `t`'s constructors. For example:
+
+~~~~~~~~
+mod foo {
+    export t;
+    
+    enum t {a, b, c};
+}
+~~~~~~~~
+
+Here, `foo` imports `t`, `a`, `b`, and `c`. 
+
+The second and third forms of export declaration can be used to export
+an `enum` item without exporting all of its constructors. These two
+forms can only be used to export an `enum` item. The second form
+exports the `enum` type name without exporting any of its
+constructors, achieving a simple kind of data abstraction. The third
+form exports an `enum` type name along with a subset of its
+constructors. For example:
+
+~~~~~~~~
+mod foo {
+    export abstract{};
+    export slightly_abstract{a, b};
+
+    enum abstract {x, y, z}
+    enum slightly_abstract {a, b, c, d}
+} 
+~~~~~~~~
+
+Module `foo` exports the types `abstract` and `slightly_abstract`, as well as
+constructors `a` and `b`, but doesn't export constructors `x`, `y`, `z`, `c`,
+or `d`.
 
 ### Functions