diff options
| author | Tobias Stolzmann <tobias.stolzmann@gmail.com> | 2018-05-29 21:43:10 +0200 |
|---|---|---|
| committer | Tobias Stolzmann <tobias.stolzmann@gmail.com> | 2018-06-05 12:03:50 +0200 |
| commit | 63885f7f72974f71d08d21bf79676ef4dc1ccaf8 (patch) | |
| tree | 1711619bf8a415f3f717ed858d603de9ddd825aa | |
| parent | f33db06e1d95249de95202664340d8639ec15c57 (diff) | |
| download | rust-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.md | 40 |
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: |
