提交 910ec6d9 编写于 作者: B bors

Auto merge of #56118 - steveklabnik:update-books, r=alexcrichton

Update books for Rust 2018

This PR:

1. updates all of the books
    * I don't know if @Gankro has further plans for the nomicon or not
2. updates the build process because TRPL is only distributing one edition now
3. fixes up the stdlib links

I think that this passes but it's 3:20 am and so I'm sending it in and will fix up anything i missed in the morning.

/cc @alexcrichton for the big beta backport
...@@ -260,22 +260,31 @@ fn run(self, builder: &Builder) { ...@@ -260,22 +260,31 @@ fn run(self, builder: &Builder) {
let compiler = self.compiler; let compiler = self.compiler;
let target = self.target; let target = self.target;
let name = self.name; let name = self.name;
// build book first edition
// build book
builder.ensure(Rustbook { builder.ensure(Rustbook {
target, target,
name: INTERNER.intern_string(format!("{}/first-edition", name)), name: INTERNER.intern_string(name.to_string()),
}); });
// build book second edition // building older edition redirects
let source_name = format!("{}/first-edition", name);
builder.ensure(Rustbook { builder.ensure(Rustbook {
target, target,
name: INTERNER.intern_string(format!("{}/second-edition", name)), name: INTERNER.intern_string(source_name),
}); });
// build book 2018 edition let source_name = format!("{}/second-edition", name);
builder.ensure(Rustbook { builder.ensure(Rustbook {
target, target,
name: INTERNER.intern_string(format!("{}/2018-edition", name)), name: INTERNER.intern_string(source_name),
});
let source_name = format!("{}/2018-edition", name);
builder.ensure(Rustbook {
target,
name: INTERNER.intern_string(source_name),
}); });
// build the version info page and CSS // build the version info page and CSS
...@@ -284,11 +293,6 @@ fn run(self, builder: &Builder) { ...@@ -284,11 +293,6 @@ fn run(self, builder: &Builder) {
target, target,
}); });
// build the index page
let index = format!("{}/index.md", name);
builder.info(&format!("Documenting book index ({})", target));
invoke_rustdoc(builder, compiler, target, &index);
// build the redirect pages // build the redirect pages
builder.info(&format!("Documenting book redirect pages ({})", target)); builder.info(&format!("Documenting book redirect pages ({})", target));
for file in t!(fs::read_dir(builder.src.join("src/doc/book/redirects"))) { for file in t!(fs::read_dir(builder.src.join("src/doc/book/redirects"))) {
......
Subproject commit e871c4598925594421d63e929fee292e6e071f97 Subproject commit 616fe4172b688393aeee5f34935cc25733c9c062
Subproject commit 7f7a597b47ed6c35c2a0f0ee6a69050fe2d5e013 Subproject commit f8a4e96feb2e5a6ed1ef170ad40e3509a7755cb4
Subproject commit b9fb838054b8441223c22eeae5b6d8e498071cd0 Subproject commit 60077efda319c95a89fe39609803c5433567adbf
Subproject commit bc342a475c09b6df8004d518382e6d5b6bcb49f7 Subproject commit 2ce92beabb912d417a7314d6da83ac9b50dc2afb
...@@ -4,7 +4,7 @@ The tracking issue for this feature is: [#35625] ...@@ -4,7 +4,7 @@ The tracking issue for this feature is: [#35625]
The RFC is: [rfc#1576]. The RFC is: [rfc#1576].
With this feature gate enabled, the [list of fragment specifiers][frags] gains one more entry: With this feature gate enabled, the [list of designators] gains one more entry:
* `literal`: a literal. Examples: 2, "string", 'c' * `literal`: a literal. Examples: 2, "string", 'c'
...@@ -12,6 +12,6 @@ A `literal` may be followed by anything, similarly to the `ident` specifier. ...@@ -12,6 +12,6 @@ A `literal` may be followed by anything, similarly to the `ident` specifier.
[rfc#1576]: http://rust-lang.github.io/rfcs/1576-macros-literal-matcher.html [rfc#1576]: http://rust-lang.github.io/rfcs/1576-macros-literal-matcher.html
[#35625]: https://github.com/rust-lang/rust/issues/35625 [#35625]: https://github.com/rust-lang/rust/issues/35625
[frags]: ../book/first-edition/macros.html#syntactic-requirements [list of designators]: ../reference/macros-by-example.html
------------------------ ------------------------
...@@ -137,8 +137,6 @@ of extensions. See `Registry::register_syntax_extension` and the ...@@ -137,8 +137,6 @@ of extensions. See `Registry::register_syntax_extension` and the
## Tips and tricks ## Tips and tricks
Some of the [macro debugging tips](../book/first-edition/macros.html#debugging-macro-code) are applicable.
You can use `syntax::parse` to turn token trees into You can use `syntax::parse` to turn token trees into
higher-level syntax elements like expressions: higher-level syntax elements like expressions:
......
...@@ -43,8 +43,8 @@ ...@@ -43,8 +43,8 @@
//! //!
//! `Rc<T>` automatically dereferences to `T` (via the [`Deref`] trait), //! `Rc<T>` automatically dereferences to `T` (via the [`Deref`] trait),
//! so you can call `T`'s methods on a value of type [`Rc<T>`][`Rc`]. To avoid name //! so you can call `T`'s methods on a value of type [`Rc<T>`][`Rc`]. To avoid name
//! clashes with `T`'s methods, the methods of [`Rc<T>`][`Rc`] itself are [associated //! clashes with `T`'s methods, the methods of [`Rc<T>`][`Rc`] itself are associated
//! functions][assoc], called using function-like syntax: //! functions, called using function-like syntax:
//! //!
//! ``` //! ```
//! use std::rc::Rc; //! use std::rc::Rc;
...@@ -234,7 +234,6 @@ ...@@ -234,7 +234,6 @@
//! [downgrade]: struct.Rc.html#method.downgrade //! [downgrade]: struct.Rc.html#method.downgrade
//! [upgrade]: struct.Weak.html#method.upgrade //! [upgrade]: struct.Weak.html#method.upgrade
//! [`None`]: ../../std/option/enum.Option.html#variant.None //! [`None`]: ../../std/option/enum.Option.html#variant.None
//! [assoc]: ../../book/first-edition/method-syntax.html#associated-functions
//! [mutability]: ../../std/cell/index.html#introducing-mutability-inside-of-something-immutable //! [mutability]: ../../std/cell/index.html#introducing-mutability-inside-of-something-immutable
#![stable(feature = "rust1", since = "1.0.0")] #![stable(feature = "rust1", since = "1.0.0")]
......
...@@ -120,8 +120,8 @@ ...@@ -120,8 +120,8 @@
/// ///
/// `Arc<T>` automatically dereferences to `T` (via the [`Deref`][deref] trait), /// `Arc<T>` automatically dereferences to `T` (via the [`Deref`][deref] trait),
/// so you can call `T`'s methods on a value of type `Arc<T>`. To avoid name /// so you can call `T`'s methods on a value of type `Arc<T>`. To avoid name
/// clashes with `T`'s methods, the methods of `Arc<T>` itself are [associated /// clashes with `T`'s methods, the methods of `Arc<T>` itself are associated
/// functions][assoc], called using function-like syntax: /// functions, called using function-like syntax:
/// ///
/// ``` /// ```
/// use std::sync::Arc; /// use std::sync::Arc;
...@@ -146,7 +146,6 @@ ...@@ -146,7 +146,6 @@
/// [downgrade]: struct.Arc.html#method.downgrade /// [downgrade]: struct.Arc.html#method.downgrade
/// [upgrade]: struct.Weak.html#method.upgrade /// [upgrade]: struct.Weak.html#method.upgrade
/// [`None`]: ../../std/option/enum.Option.html#variant.None /// [`None`]: ../../std/option/enum.Option.html#variant.None
/// [assoc]: ../../book/first-edition/method-syntax.html#associated-functions
/// [`RefCell<T>`]: ../../std/cell/struct.RefCell.html /// [`RefCell<T>`]: ../../std/cell/struct.RefCell.html
/// [`std::sync`]: ../../std/sync/index.html /// [`std::sync`]: ../../std/sync/index.html
/// [`Arc::clone(&from)`]: #method.clone /// [`Arc::clone(&from)`]: #method.clone
......
...@@ -19,7 +19,7 @@ ...@@ -19,7 +19,7 @@
/// Converts a `u32` to a `char`. /// Converts a `u32` to a `char`.
/// ///
/// Note that all [`char`]s are valid [`u32`]s, and can be cast to one with /// Note that all [`char`]s are valid [`u32`]s, and can be cast to one with
/// [`as`]: /// `as`:
/// ///
/// ``` /// ```
/// let c = '💯'; /// let c = '💯';
...@@ -34,7 +34,6 @@ ...@@ -34,7 +34,6 @@
/// ///
/// [`char`]: ../../std/primitive.char.html /// [`char`]: ../../std/primitive.char.html
/// [`u32`]: ../../std/primitive.u32.html /// [`u32`]: ../../std/primitive.u32.html
/// [`as`]: ../../book/first-edition/casting-between-types.html#as
/// ///
/// For an unsafe version of this function which ignores these checks, see /// For an unsafe version of this function which ignores these checks, see
/// [`from_u32_unchecked`]. /// [`from_u32_unchecked`].
...@@ -71,7 +70,7 @@ pub fn from_u32(i: u32) -> Option<char> { ...@@ -71,7 +70,7 @@ pub fn from_u32(i: u32) -> Option<char> {
/// Converts a `u32` to a `char`, ignoring validity. /// Converts a `u32` to a `char`, ignoring validity.
/// ///
/// Note that all [`char`]s are valid [`u32`]s, and can be cast to one with /// Note that all [`char`]s are valid [`u32`]s, and can be cast to one with
/// [`as`]: /// `as`:
/// ///
/// ``` /// ```
/// let c = '💯'; /// let c = '💯';
...@@ -86,7 +85,6 @@ pub fn from_u32(i: u32) -> Option<char> { ...@@ -86,7 +85,6 @@ pub fn from_u32(i: u32) -> Option<char> {
/// ///
/// [`char`]: ../../std/primitive.char.html /// [`char`]: ../../std/primitive.char.html
/// [`u32`]: ../../std/primitive.u32.html /// [`u32`]: ../../std/primitive.u32.html
/// [`as`]: ../../book/first-edition/casting-between-types.html#as
/// ///
/// # Safety /// # Safety
/// ///
......
...@@ -532,7 +532,7 @@ fn zip<U>(self, other: U) -> Zip<Self, U::IntoIter> where ...@@ -532,7 +532,7 @@ fn zip<U>(self, other: U) -> Zip<Self, U::IntoIter> where
/// If you're doing some sort of looping for a side effect, it's considered /// If you're doing some sort of looping for a side effect, it's considered
/// more idiomatic to use [`for`] than `map()`. /// more idiomatic to use [`for`] than `map()`.
/// ///
/// [`for`]: ../../book/first-edition/loops.html#for /// [`for`]: ../../book/ch03-05-control-flow.html#looping-through-a-collection-with-for
/// ///
/// # Examples /// # Examples
/// ///
...@@ -580,7 +580,7 @@ fn map<B, F>(self, f: F) -> Map<Self, F> where ...@@ -580,7 +580,7 @@ fn map<B, F>(self, f: F) -> Map<Self, F> where
/// cases `for_each` may also be faster than a loop, because it will use /// cases `for_each` may also be faster than a loop, because it will use
/// internal iteration on adaptors like `Chain`. /// internal iteration on adaptors like `Chain`.
/// ///
/// [`for`]: ../../book/first-edition/loops.html#for /// [`for`]: ../../book/ch03-05-control-flow.html#looping-through-a-collection-with-for
/// ///
/// # Examples /// # Examples
/// ///
...@@ -1669,7 +1669,7 @@ fn try_for_each<F, R>(&mut self, mut f: F) -> R where ...@@ -1669,7 +1669,7 @@ fn try_for_each<F, R>(&mut self, mut f: F) -> R where
/// use a `for` loop with a list of things to build up a result. Those /// use a `for` loop with a list of things to build up a result. Those
/// can be turned into `fold()`s: /// can be turned into `fold()`s:
/// ///
/// [`for`]: ../../book/first-edition/loops.html#for /// [`for`]: ../../book/ch03-05-control-flow.html#looping-through-a-collection-with-for
/// ///
/// ``` /// ```
/// let numbers = [1, 2, 3, 4, 5]; /// let numbers = [1, 2, 3, 4, 5];
......
...@@ -132,7 +132,6 @@ ...@@ -132,7 +132,6 @@
/// [uninit]: fn.uninitialized.html /// [uninit]: fn.uninitialized.html
/// [clone]: ../clone/trait.Clone.html /// [clone]: ../clone/trait.Clone.html
/// [swap]: fn.swap.html /// [swap]: fn.swap.html
/// [FFI]: ../../book/first-edition/ffi.html
/// [box]: ../../std/boxed/struct.Box.html /// [box]: ../../std/boxed/struct.Box.html
/// [leak]: ../../std/boxed/struct.Box.html#method.leak /// [leak]: ../../std/boxed/struct.Box.html#method.leak
/// [into_raw]: ../../std/boxed/struct.Box.html#method.into_raw /// [into_raw]: ../../std/boxed/struct.Box.html#method.into_raw
...@@ -479,7 +478,7 @@ pub const fn needs_drop<T>() -> bool { ...@@ -479,7 +478,7 @@ pub const fn needs_drop<T>() -> bool {
/// ///
/// This has the same effect as allocating space with /// This has the same effect as allocating space with
/// [`mem::uninitialized`][uninit] and then zeroing it out. It is useful for /// [`mem::uninitialized`][uninit] and then zeroing it out. It is useful for
/// [FFI] sometimes, but should generally be avoided. /// FFI sometimes, but should generally be avoided.
/// ///
/// There is no guarantee that an all-zero byte-pattern represents a valid value of /// There is no guarantee that an all-zero byte-pattern represents a valid value of
/// some type `T`. If `T` has a destructor and the value is destroyed (due to /// some type `T`. If `T` has a destructor and the value is destroyed (due to
...@@ -490,7 +489,6 @@ pub const fn needs_drop<T>() -> bool { ...@@ -490,7 +489,6 @@ pub const fn needs_drop<T>() -> bool {
/// many of the same caveats. /// many of the same caveats.
/// ///
/// [uninit]: fn.uninitialized.html /// [uninit]: fn.uninitialized.html
/// [FFI]: ../../book/first-edition/ffi.html
/// [ub]: ../../reference/behavior-considered-undefined.html /// [ub]: ../../reference/behavior-considered-undefined.html
/// ///
/// # Examples /// # Examples
...@@ -514,11 +512,9 @@ pub unsafe fn zeroed<T>() -> T { ...@@ -514,11 +512,9 @@ pub unsafe fn zeroed<T>() -> T {
/// **This is incredibly dangerous and should not be done lightly. Deeply /// **This is incredibly dangerous and should not be done lightly. Deeply
/// consider initializing your memory with a default value instead.** /// consider initializing your memory with a default value instead.**
/// ///
/// This is useful for [FFI] functions and initializing arrays sometimes, /// This is useful for FFI functions and initializing arrays sometimes,
/// but should generally be avoided. /// but should generally be avoided.
/// ///
/// [FFI]: ../../book/first-edition/ffi.html
///
/// # Undefined behavior /// # Undefined behavior
/// ///
/// It is [undefined behavior][ub] to read uninitialized memory, even just an /// It is [undefined behavior][ub] to read uninitialized memory, even just an
...@@ -689,10 +685,9 @@ pub fn replace<T>(dest: &mut T, mut src: T) -> T { ...@@ -689,10 +685,9 @@ pub fn replace<T>(dest: &mut T, mut src: T) -> T {
/// While this does call the argument's implementation of [`Drop`][drop], /// While this does call the argument's implementation of [`Drop`][drop],
/// it will not release any borrows, as borrows are based on lexical scope. /// it will not release any borrows, as borrows are based on lexical scope.
/// ///
/// This effectively does nothing for /// This effectively does nothing for types which implement `Copy`, e.g.
/// [types which implement `Copy`](../../book/first-edition/ownership.html#copy-types), /// integers. Such values are copied and _then_ moved into the function, so the
/// e.g. integers. Such values are copied and _then_ moved into the function, /// value persists after this function call.
/// so the value persists after this function call.
/// ///
/// This function is not magic; it is literally defined as /// This function is not magic; it is literally defined as
/// ///
......
...@@ -58,7 +58,7 @@ ...@@ -58,7 +58,7 @@
//! [`NonNull::dangling`] in such cases. //! [`NonNull::dangling`] in such cases.
//! //!
//! [aliasing]: ../../nomicon/aliasing.html //! [aliasing]: ../../nomicon/aliasing.html
//! [book]: ../../book/second-edition/ch19-01-unsafe-rust.html#dereferencing-a-raw-pointer //! [book]: ../../book/ch19-01-unsafe-rust.html#dereferencing-a-raw-pointer
//! [ub]: ../../reference/behavior-considered-undefined.html //! [ub]: ../../reference/behavior-considered-undefined.html
//! [null]: ./fn.null.html //! [null]: ./fn.null.html
//! [zst]: ../../nomicon/exotic-sizes.html#zero-sized-types-zsts //! [zst]: ../../nomicon/exotic-sizes.html#zero-sized-types-zsts
......
...@@ -21,11 +21,7 @@ ...@@ -21,11 +21,7 @@
/// The representation of a trait object like `&SomeTrait`. /// The representation of a trait object like `&SomeTrait`.
/// ///
/// This struct has the same layout as types like `&SomeTrait` and /// This struct has the same layout as types like `&SomeTrait` and
/// `Box<AnotherTrait>`. The [Trait Objects chapter of the /// `Box<AnotherTrait>`.
/// Book][moreinfo] contains more details about the precise nature of
/// these internals.
///
/// [moreinfo]: ../../book/first-edition/trait-objects.html#representation
/// ///
/// `TraitObject` is guaranteed to match layouts, but it is not the /// `TraitObject` is guaranteed to match layouts, but it is not the
/// type of trait objects (e.g. the fields are not directly accessible /// type of trait objects (e.g. the fields are not directly accessible
......
...@@ -185,7 +185,7 @@ ...@@ -185,7 +185,7 @@
//! [slice]: primitive.slice.html //! [slice]: primitive.slice.html
//! [`atomic`]: sync/atomic/index.html //! [`atomic`]: sync/atomic/index.html
//! [`collections`]: collections/index.html //! [`collections`]: collections/index.html
//! [`for`]: ../book/first-edition/loops.html#for //! [`for`]: ../book/ch03-05-control-flow.html#looping-through-a-collection-with-for
//! [`format!`]: macro.format.html //! [`format!`]: macro.format.html
//! [`fs`]: fs/index.html //! [`fs`]: fs/index.html
//! [`io`]: io/index.html //! [`io`]: io/index.html
...@@ -200,14 +200,14 @@ ...@@ -200,14 +200,14 @@
//! [`sync`]: sync/index.html //! [`sync`]: sync/index.html
//! [`thread`]: thread/index.html //! [`thread`]: thread/index.html
//! [`use std::env`]: env/index.html //! [`use std::env`]: env/index.html
//! [`use`]: ../book/first-edition/crates-and-modules.html#importing-modules-with-use //! [`use`]: ../book/ch07-02-modules-and-use-to-control-scope-and-privacy.html#the-use-keyword-to-bring-paths-into-a-scope
//! [crate root]: ../book/first-edition/crates-and-modules.html#basic-terminology-crates-and-modules //! [crate root]: ../book/ch07-01-packages-and-crates-for-making-libraries-and-executables.html
//! [crates.io]: https://crates.io //! [crates.io]: https://crates.io
//! [deref-coercions]: ../book/second-edition/ch15-02-deref.html#implicit-deref-coercions-with-functions-and-methods //! [deref-coercions]: ../book/ch15-02-deref.html#implicit-deref-coercions-with-functions-and-methods
//! [files]: fs/struct.File.html //! [files]: fs/struct.File.html
//! [multithreading]: thread/index.html //! [multithreading]: thread/index.html
//! [other]: #what-is-in-the-standard-library-documentation //! [other]: #what-is-in-the-standard-library-documentation
//! [primitive types]: ../book/first-edition/primitive-types.html //! [primitive types]: ../book/ch03-02-data-types.html
#![stable(feature = "rust1", since = "1.0.0")] #![stable(feature = "rust1", since = "1.0.0")]
#![doc(html_logo_url = "https://www.rust-lang.org/logos/rust-logo-128x128-blk-v2.png", #![doc(html_logo_url = "https://www.rust-lang.org/logos/rust-logo-128x128-blk-v2.png",
......
...@@ -32,7 +32,7 @@ ...@@ -32,7 +32,7 @@
/// ///
/// [`Result`] enum is often a better solution for recovering from errors than /// [`Result`] enum is often a better solution for recovering from errors than
/// using the `panic!` macro. This macro should be used to avoid proceeding using /// using the `panic!` macro. This macro should be used to avoid proceeding using
/// incorrect values, such as from external sources. Detailed information about /// incorrect values, such as from external sources. Detailed information about
/// error handling is found in the [book]. /// error handling is found in the [book].
/// ///
/// The multi-argument form of this macro panics with a string and has the /// The multi-argument form of this macro panics with a string and has the
...@@ -45,7 +45,7 @@ ...@@ -45,7 +45,7 @@
/// [`Result`]: ../std/result/enum.Result.html /// [`Result`]: ../std/result/enum.Result.html
/// [`format!`]: ../std/macro.format.html /// [`format!`]: ../std/macro.format.html
/// [`compile_error!`]: ../std/macro.compile_error.html /// [`compile_error!`]: ../std/macro.compile_error.html
/// [book]: ../book/second-edition/ch09-01-unrecoverable-errors-with-panic.html /// [book]: ../book/ch09-00-error-handling.html
/// ///
/// # Current implementation /// # Current implementation
/// ///
...@@ -839,8 +839,8 @@ mod builtin { ...@@ -839,8 +839,8 @@ mod builtin {
/// boolean expression evaluation of configuration flags. This frequently /// boolean expression evaluation of configuration flags. This frequently
/// leads to less duplicated code. /// leads to less duplicated code.
/// ///
/// The syntax given to this macro is the same syntax as [the `cfg` /// The syntax given to this macro is the same syntax as the `cfg`
/// attribute](../book/first-edition/conditional-compilation.html). /// attribute.
/// ///
/// # Examples /// # Examples
/// ///
...@@ -915,7 +915,7 @@ mod builtin { ...@@ -915,7 +915,7 @@ mod builtin {
/// Unsafe code relies on `assert!` to enforce run-time invariants that, if /// Unsafe code relies on `assert!` to enforce run-time invariants that, if
/// violated could lead to unsafety. /// violated could lead to unsafety.
/// ///
/// Other use-cases of `assert!` include [testing] and enforcing run-time /// Other use-cases of `assert!` include testing and enforcing run-time
/// invariants in safe code (whose violation cannot result in unsafety). /// invariants in safe code (whose violation cannot result in unsafety).
/// ///
/// # Custom Messages /// # Custom Messages
...@@ -926,7 +926,6 @@ mod builtin { ...@@ -926,7 +926,6 @@ mod builtin {
/// ///
/// [`panic!`]: macro.panic.html /// [`panic!`]: macro.panic.html
/// [`debug_assert!`]: macro.debug_assert.html /// [`debug_assert!`]: macro.debug_assert.html
/// [testing]: ../book/second-edition/ch11-01-writing-tests.html#checking-results-with-the-assert-macro
/// [`std::fmt`]: ../std/fmt/index.html /// [`std::fmt`]: ../std/fmt/index.html
/// ///
/// # Examples /// # Examples
......
...@@ -22,7 +22,7 @@ ...@@ -22,7 +22,7 @@
/// `bool` implements various traits, such as [`BitAnd`], [`BitOr`], [`Not`], etc., /// `bool` implements various traits, such as [`BitAnd`], [`BitOr`], [`Not`], etc.,
/// which allow us to perform boolean operations using `&`, `|` and `!`. /// which allow us to perform boolean operations using `&`, `|` and `!`.
/// ///
/// [`if`] always demands a `bool` value. [`assert!`], being an important macro in testing, /// `if` always demands a `bool` value. [`assert!`], being an important macro in testing,
/// checks whether an expression returns `true`. /// checks whether an expression returns `true`.
/// ///
/// ``` /// ```
...@@ -31,7 +31,6 @@ ...@@ -31,7 +31,6 @@
/// ``` /// ```
/// ///
/// [`assert!`]: macro.assert.html /// [`assert!`]: macro.assert.html
/// [`if`]: ../book/first-edition/if.html
/// [`BitAnd`]: ops/trait.BitAnd.html /// [`BitAnd`]: ops/trait.BitAnd.html
/// [`BitOr`]: ops/trait.BitOr.html /// [`BitOr`]: ops/trait.BitOr.html
/// [`Not`]: ops/trait.Not.html /// [`Not`]: ops/trait.Not.html
...@@ -695,7 +694,7 @@ mod prim_str { } ...@@ -695,7 +694,7 @@ mod prim_str { }
/// assert_eq!(tuple.2, 'c'); /// assert_eq!(tuple.2, 'c');
/// ``` /// ```
/// ///
/// For more about tuples, see [the book](../book/first-edition/primitive-types.html#tuples). /// For more about tuples, see [the book](../book/ch03-02-data-types.html#the-tuple-type).
/// ///
/// # Trait implementations /// # Trait implementations
/// ///
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册