@@ -1353,11 +1353,180 @@ mod super_keyword {}
1353
1353
1354
1354
#[ doc( keyword = "trait" ) ]
1355
1355
//
1356
- /// A common interface for a class of types.
1356
+ /// A common interface for a group of types.
1357
1357
///
1358
- /// The documentation for this keyword is [not yet complete]. Pull requests welcome!
1358
+ /// A `trait` is an interface that types can implement. It is said they
1359
+ /// "implement" the trait or "conform" to the trait.
1359
1360
///
1360
- /// [not yet complete]: https://github.com/rust-lang/rust/issues/34601
1361
+ /// This interface is made up of three varieties of items:
1362
+ ///
1363
+ /// - functions
1364
+ /// - types
1365
+ /// - constants
1366
+ ///
1367
+ /// Traits may also contain additional type parameters. Those type parameters
1368
+ /// or the trait itself can be constrained by other traits.
1369
+ ///
1370
+ /// See the [Reference][Ref-Traits] for a lot more information on traits.
1371
+ ///
1372
+ /// # Examples
1373
+ ///
1374
+ /// Traits are declared using the `trait` keyword. Types can implement them
1375
+ /// using [`impl`] `Trait` [`for`] `Type`:
1376
+ ///
1377
+ /// ```rust
1378
+ /// trait Zero {
1379
+ /// const ZERO: Self;
1380
+ /// fn is_zero(&self) -> bool;
1381
+ /// }
1382
+ ///
1383
+ /// impl Zero for i32 {
1384
+ /// const ZERO: Self = 0;
1385
+ ///
1386
+ /// fn is_zero(&self) -> bool {
1387
+ /// *self == Self::ZERO
1388
+ /// }
1389
+ /// }
1390
+ ///
1391
+ /// assert_eq!(i32::ZERO, 0);
1392
+ /// assert!(i32::ZERO.is_zero());
1393
+ /// assert!(!4.is_zero());
1394
+ /// ```
1395
+ ///
1396
+ /// With an associated type:
1397
+ ///
1398
+ /// ```rust
1399
+ /// trait Builder {
1400
+ /// type Built;
1401
+ ///
1402
+ /// fn build(&self) -> Self::Built;
1403
+ /// }
1404
+ /// ```
1405
+ ///
1406
+ /// Traits can be generic, with constraints or without:
1407
+ ///
1408
+ /// ```rust
1409
+ /// trait MaybeFrom<T> {
1410
+ /// fn maybe_from(value: T) -> Option<Self>
1411
+ /// where
1412
+ /// Self: Sized;
1413
+ /// }
1414
+ /// ```
1415
+ ///
1416
+ /// Traits can build upon the requirements of other traits. In the example
1417
+ /// below `Iterator` is a **supertrait** and `ThreeIterator` is a **subtrait**:
1418
+ ///
1419
+ /// ```rust
1420
+ /// trait ThreeIterator: std::iter::Iterator {
1421
+ /// fn next_three(&mut self) -> Option<[Self::Item; 3]>;
1422
+ /// }
1423
+ /// ```
1424
+ ///
1425
+ /// Traits can be used in functions, as parameters:
1426
+ ///
1427
+ /// ```rust
1428
+ /// # #![allow(dead_code)]
1429
+ /// fn debug_iter<I: Iterator>(it: I) where I::Item: std::fmt::Debug {
1430
+ /// for elem in it {
1431
+ /// println!("{:#?}", elem);
1432
+ /// }
1433
+ /// }
1434
+ ///
1435
+ /// // u8_len_1, u8_len_2 and u8_len_3 are equivalent
1436
+ ///
1437
+ /// fn u8_len_1(val: impl Into<Vec<u8>>) -> usize {
1438
+ /// val.into().len()
1439
+ /// }
1440
+ ///
1441
+ /// fn u8_len_2<T: Into<Vec<u8>>>(val: T) -> usize {
1442
+ /// val.into().len()
1443
+ /// }
1444
+ ///
1445
+ /// fn u8_len_3<T>(val: T) -> usize
1446
+ /// where
1447
+ /// T: Into<Vec<u8>>,
1448
+ /// {
1449
+ /// val.into().len()
1450
+ /// }
1451
+ /// ```
1452
+ ///
1453
+ /// Or as return types:
1454
+ ///
1455
+ /// ```rust
1456
+ /// # #![allow(dead_code)]
1457
+ /// fn from_zero_to(v: u8) -> impl Iterator<Item = u8> {
1458
+ /// (0..v).into_iter()
1459
+ /// }
1460
+ /// ```
1461
+ ///
1462
+ /// The use of the [`impl`] keyword in this position allows the function writer
1463
+ /// to hide the concrete type as an implementation detail which can change
1464
+ /// without breaking user's code.
1465
+ ///
1466
+ /// # Trait objects
1467
+ ///
1468
+ /// A *trait object* is an opaque value of another type that implements a set of
1469
+ /// traits. A trait object implements all specified traits as well as their
1470
+ /// supertraits (if any).
1471
+ ///
1472
+ /// The syntax is the following: `dyn BaseTrait + AutoTrait1 + ... AutoTraitN`.
1473
+ /// Only one `BaseTrait` can be used so this will not compile:
1474
+ ///
1475
+ /// ```rust,compile_fail,E0225
1476
+ /// trait A {}
1477
+ /// trait B {}
1478
+ ///
1479
+ /// let _: Box<dyn A + B>;
1480
+ /// ```
1481
+ ///
1482
+ /// Neither will this, which is a syntax error:
1483
+ ///
1484
+ /// ```rust,compile_fail
1485
+ /// trait A {}
1486
+ /// trait B {}
1487
+ ///
1488
+ /// let _: Box<dyn A + dyn B>;
1489
+ /// ```
1490
+ ///
1491
+ /// On the other hand, this is correct:
1492
+ ///
1493
+ /// ```rust
1494
+ /// trait A {}
1495
+ ///
1496
+ /// let _: Box<dyn A + Send + Sync>;
1497
+ /// ```
1498
+ ///
1499
+ /// The [Reference][Ref-Trait-Objects] has more information about trait objects,
1500
+ /// their limitations and the differences between editions.
1501
+ ///
1502
+ /// # Unsafe traits
1503
+ ///
1504
+ /// Some traits may be unsafe to implement. Using the [`unsafe`] keyword in
1505
+ /// front of the trait's declaration is used to mark this:
1506
+ ///
1507
+ /// ```rust
1508
+ /// unsafe trait UnsafeTrait {}
1509
+ ///
1510
+ /// unsafe impl UnsafeTrait for i32 {}
1511
+ /// ```
1512
+ ///
1513
+ /// # Differences between the 2015 and 2018 editions
1514
+ ///
1515
+ /// In the 2015 edition parameters pattern where not needed for traits:
1516
+ ///
1517
+ /// ```rust,edition2015
1518
+ /// trait Tr {
1519
+ /// fn f(i32);
1520
+ /// }
1521
+ /// ```
1522
+ ///
1523
+ /// This behavior is no longer valid in edition 2018.
1524
+ ///
1525
+ /// [`for`]: keyword.for.html
1526
+ /// [`impl`]: keyword.impl.html
1527
+ /// [`unsafe`]: keyword.unsafe.html
1528
+ /// [Ref-Traits]: ../reference/items/traits.html
1529
+ /// [Ref-Trait-Objects]: ../reference/types/trait-object.html
1361
1530
mod trait_keyword { }
1362
1531
1363
1532
#[ doc( keyword = "true" ) ]
0 commit comments