Rust 中 pub 关键字的作用是什么?

推荐答案

在 Rust 中,pub 关键字用于控制模块、函数、结构体、枚举、常量等项的可见性。使用 pub 可以将这些项标记为公开的,从而允许其他模块或外部代码访问它们。

本题详细解读

1. pub 关键字的基本用法

在 Rust 中,默认情况下,模块内的所有项(如函数、结构体、枚举等)都是私有的,只能在定义它们的模块内部访问。如果希望这些项能够在其他模块或外部代码中被访问,就需要使用 pub 关键字将它们标记为公开的。

例如:

-- -------------------- ---- -------
--- --------- -
    --- -- ----------------- -
        -------------- -- - ------ ------------
    -

    -- ------------------ -
        -------------- -- - ------- ------------
    -
-

-- ------ -
    ----------------------------- -- ----
    -- ------------------------------ -- ---------
-

在上面的代码中,public_function 被标记为 pub,因此可以在 main 函数中调用。而 private_function 是私有的,只能在 my_module 模块内部访问。

2. pub 关键字的其他用法

除了标记函数为公开的,pub 还可以用于结构体、枚举、常量等项。例如:

-- -------------------- ---- -------
--- --------- -
    --- ------ ------------ -
        --- ------ ----
    -

    --- ---- ---------- -
        ---------
        ---------
    -

    --- ----- ------------- --- - ---
-

-- ------ -
    --- -------- - ----------------------- - ------ -- --
    -------------- ---------------- -- ----

    --- ------- - -------------------------------- -- ----

    -------------- ------------------------- -- ----
-

在这个例子中,PublicStructPublicEnumPUBLIC_CONST 都被标记为 pub,因此可以在 main 函数中访问。

3. pub 与模块层级

pub 关键字还可以与模块层级结合使用,控制模块内部的可见性。例如:

-- -------------------- ---- -------
--- ------------ -
    --- --- ------------ -
        --- -- ---------------- -
            -------------- -- -- ----- ------------
        -
    -
-

-- ------ -
    --------------------------------------------- -- ----
-

在这个例子中,inner_moduleinner_function 都被标记为 pub,因此可以在 main 函数中访问。

4. pub 与结构体字段

对于结构体,pub 关键字还可以用于控制字段的可见性。例如:

-- -------------------- ---- -------
--- --------- -
    --- ------ ------------ -
        --- ------- ----
        ------- ----
    -
-

-- ------ -
    --- -------- - ----------------------- - ------- --- ------- -- --
    -------------- ----------------- -- ----
    -- -------------- ----------------- -- ---------
-

在这个例子中,field1 被标记为 pub,因此可以在 main 函数中访问。而 field2 是私有的,只能在 my_module 模块内部访问。

5. pub 与枚举变体

对于枚举,pub 关键字可以用于控制枚举变体的可见性。例如:

-- -------------------- ---- -------
--- --------- -
    --- ---- ---------- -
        ---------
        ---------
    -
-

-- ------ -
    --- ------- - -------------------------------- -- ----
-

在这个例子中,PublicEnum 被标记为 pub,因此可以在 main 函数中访问其变体。

6. pub 与常量

对于常量,pub 关键字可以用于控制常量的可见性。例如:

在这个例子中,PUBLIC_CONST 被标记为 pub,因此可以在 main 函数中访问。

7. pub 与模块重导出

pub 关键字还可以用于模块重导出(re-exporting),即将一个模块中的项重新导出到另一个模块中。例如:

-- -------------------- ---- -------
--- --------- -
    --- --- ------------ -
        --- -- ---------------- -
            -------------- -- -- ----- ------------
        -
    -

    --- --- -----------------------------
-

-- ------ -
    ---------------------------- -- ----
-

在这个例子中,inner_function 被重导出到 my_module 中,因此可以在 main 函数中直接通过 my_module::inner_function 访问。

8. pubcrate 可见性

在 Rust 中,pub 关键字还可以与 crate 关键字结合使用,控制项在当前 crate 内的可见性。例如:

-- -------------------- ---- -------
--- --------- -
    ---------- -- ------------------------ -
        -------------- -------- -- ------- ------ --- ---------
    -
-

-- ------ -
    ------------------------------------ -- ----
-

在这个例子中,crate_visible_function 被标记为 pub(crate),因此可以在当前 crate 内的任何地方访问,但在 crate 外部无法访问。

9. pubsuper 可见性

pub 关键字还可以与 super 关键字结合使用,控制项在父模块中的可见性。例如:

-- -------------------- ---- -------
--- ------------ -
    --- --- ------------ -
        ---------- -- ------------------------- -
            -------------- -------- -- ------- -- --- ------ ----------
        -
    -

    -- --------------- -
        ---------------------------------------- -- ----
    -
-

-- ------ -
    -- ------------------------------------------------------ -- ---------
-

在这个例子中,parent_visible_function 被标记为 pub(super),因此可以在 outer_module 中访问,但在 main 函数中无法访问。

10. pubin 可见性

pub 关键字还可以与 in 关键字结合使用,控制项在指定路径中的可见性。例如:

-- -------------------- ---- -------
--- ------------ -
    --- --- ------------ -
        ------ -------------------- -- ------------------------- -
            -------------- -------- -- ------- ------ ----------------
        -
    -

    -- --------------- -
        ---------------------------------------- -- ----
    -
-

-- ------ -
    -- ------------------------------------------------------ -- ---------
-

在这个例子中,module_visible_function 被标记为 pub(in crate::outer_module),因此可以在 outer_module 中访问,但在 main 函数中无法访问。

纠错
反馈