我是否需要始终将基本结构放在 main() 之外,以便它们是全局变量?

sea*_*mus 0 struct rust

我正在阅读 Rust 文档,并在使用函数创建结构时遇到了问题:

fn main() {
    let s1 = String::from("bob");
    let s2 = String::from("bob@aol.com");

    struct User {
        name: String,
        email: String,
    }

    let user1 = build_user(s1, s2); //or &s1, &s2
}

fn build_user(email: String, name: String) -> User {
    //or &String, &String
    User { email, name }
}
Run Code Online (Sandbox Code Playgroud)

错误说:

fn main() {
    let s1 = String::from("bob");
    let s2 = String::from("bob@aol.com");

    struct User {
        name: String,
        email: String,
    }

    let user1 = build_user(s1, s2); //or &s1, &s2
}

fn build_user(email: String, name: String) -> User {
    //or &String, &String
    User { email, name }
}
Run Code Online (Sandbox Code Playgroud)

如果我想用函数构建一个结构体,我是否还必须通过引用传递基础结构体?

She*_*ter 5

您不必总是将它们放在something之外,但您必须在足够高的级别声明它们,以便所有想要使用它的人都可以看到它,可见性。

通过在main函数内部定义类型,只有函数体main可以访问它。在这种情况下,是的,你应该把的结构之外的定义main,因为这两个mainbuild_user需要知道的是:

struct User {
    name: String,
    email: String,
}

fn build_user(email: String, name: String) -> User {
    User { email, name }
}
Run Code Online (Sandbox Code Playgroud)

当您继续阅读时,您会发现编写此代码的惯用方式:

fn main() {
    let s1 = String::from("bob");
    let s2 = String::from("bob@aol.com");

    let user1 = User::new(s1, s2);
}

struct User {
    name: String,
    email: String,
}

impl User {
    fn new(email: String, name: String) -> User {
        User { email, name }
    }
}
Run Code Online (Sandbox Code Playgroud)