注释

词法
行注释 :
      // (~[/ ! \n] | //) ~\n*
   | //

块注释 :
      /* (~[* !] | ** | 块注释或文档) (块注释或文档 | ~*/)* */
   | /**/
   | /***/

内部行文档 :
   //! ~[\n 孤立CR]*

内部块文档 :
   /*! ( 块注释或文档 | ~[*/ 孤立CR] )* */

外部行文档 :
   /// (~/ ~[\n 孤立CR]*)?

外部块文档 :
   /** (~* | 块注释或文档 ) (块注释或文档 | ~[*/ 孤立CR])* */

块注释或文档 :
      块注释
   | 外部块文档
   | 内部块文档

孤立CR :
   \r 不紧随 \n

非文档注释

注释遵循 C++ 风格的行 (//) 和块 (/* ... */) 注释的一般形式。支持嵌套的块注释。

非文档注释被解释为空白的一种形式。

文档注释

以三个斜线开始的行文档注释 (///),以及块文档注释 (/** ... */),都是内部文档注释,被解释为 doc 属性 的特殊语法。 相当于在注释主体的周围写上 #[doc="..."] ,即 /// Foo/** Bar */ 会转换成 #[doc="Bar"]

//! 开头的行注释和 /*! ... */ 块注释也是文档注释,其应用于父级,而不是之后条目。 相当于在注释位置写上 #![doc="..."]//! 注释通常用于拥有源文件的模块。

在文档注释中不允许孤立的 CR (\r) ,即后面没有 LF (\n) 。

示例

#![allow(unused)]
fn main() {
//! 应用于这个 crate 隐式匿名模块的文档注释

pub mod outer_module {

    //!  - 内部行文档
    //!! - 仍是内部行文档 (但开始有感叹号)

    /*!  - 内部块文档 */
    /*!! - 仍是内部块文档 (但开始有感叹号) */

    //   - 仅是注释
    ///  - 外部行文档 (正好 3 斜线)
    //// - 仅是注释

    /*   - 仅是注释 */
    /**  - 外部块文档 (正好 2 星号) */
    /*** - 仅是注释 */

    pub mod inner_module {}

    pub mod nested_comments {
        /* 在 Rust /* 可以 /* 嵌套注释 */ */ */

        // 所有三种类型的块注释都可以包含或嵌套任何其他类型的注释:

        /*   /* */  /** */  /*! */  */
        /*!  /* */  /** */  /*! */  */
        /**  /* */  /** */  /*! */  */
        pub mod dummy_item {}
    }

    pub mod degenerate_cases {
        // 空内部行文档
        //!

        // 空内部块文档
        /*!*/

        // 空行注释
        //

        // 空外部行文档
        ///

        // 空块注释
        /**/

        pub mod dummy_item {}

        // 空的 2 星号块不是块文档,而是块注释。
        /***/

    }

    /* 下一个是不允许的,
       外部文档注释需要一个条目来接收文档 */

    /// 我的条目在哪里?
  mod boo {}
}
}