about summary refs log tree commit diff
diff options
context:
space:
mode:
authorTobias Stolzmann <tobias.stolzmann@gmail.com>2018-05-29 21:43:10 +0200
committerTobias Stolzmann <tobias.stolzmann@gmail.com>2018-06-05 12:03:50 +0200
commit63885f7f72974f71d08d21bf79676ef4dc1ccaf8 (patch)
tree1711619bf8a415f3f717ed858d603de9ddd825aa
parentf33db06e1d95249de95202664340d8639ec15c57 (diff)
downloadrust-63885f7f72974f71d08d21bf79676ef4dc1ccaf8.tar.gz
rust-63885f7f72974f71d08d21bf79676ef4dc1ccaf8.zip
Update rustdoc book to suggest using Termination trait instead of hidden ‘foo’ function
-rw-r--r--src/doc/rustdoc/src/documentation-tests.md40
1 files changed, 29 insertions, 11 deletions
diff --git a/src/doc/rustdoc/src/documentation-tests.md b/src/doc/rustdoc/src/documentation-tests.md
index fd7d1713ca5..1fa385d652f 100644
--- a/src/doc/rustdoc/src/documentation-tests.md
+++ b/src/doc/rustdoc/src/documentation-tests.md
@@ -168,37 +168,55 @@ By repeating all parts of the example, you can ensure that your example still
 compiles, while only showing the parts that are relevant to that part of your
 explanation.
 
-Another case where the use of `#` is handy is when you want to ignore
-error handling. Lets say you want the following,
+
+## Using `?` in doc tests
+
+A complete error handling is often not useful in your example, as it would add
+significant amounts of boilerplate code. Instead, you may want the following:
 
 ```ignore
+/// ```
 /// use std::io;
 /// let mut input = String::new();
 /// io::stdin().read_line(&mut input)?;
+/// ```
 ```
 
-The problem is that `?` returns a `Result<T, E>` and test functions
-don't return anything so this will give a mismatched types error.
+The problem is that `?` returns a `Result<T, E>` and test functions don't
+return anything, so this will give a mismatched types error.
+
+You can get around this limitation by manually adding a `main` that returns
+`Result<T, E>`, because `Result<T, E>` implements the `Termination` trait:
 
 ```ignore
 /// A doc test using ?
 ///
 /// ```
 /// use std::io;
-/// # fn foo() -> io::Result<()> {
+///
+/// fn main() -> io::Result<()> {
+///     let mut input = String::new();
+///     io::stdin().read_line(&mut input)?;
+///     Ok(())
+/// }
+/// ```
+```
+
+Together with the `# ` from the section above, you arrive at a solution that
+appears to the reader as the initial idea but works with doc tests:
+
+```ignore
+/// ```
+/// use std::io;
+/// # fn main() -> io::Result<()> {
 /// let mut input = String::new();
 /// io::stdin().read_line(&mut input)?;
 /// # Ok(())
 /// # }
 /// ```
-# fn foo() {}
 ```
 
-You can get around this by wrapping the code in a function. This catches
-and swallows the `Result<T, E>` when running tests on the docs. This
-pattern appears regularly in the standard library.
-
-### Documenting macros
+## Documenting macros
 
 Here’s an example of documenting a macro: