我正在阅读 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)
如果我想用函数构建一个结构体,我是否还必须通过引用传递基础结构体?
您不必总是将它们放在something之外,但您必须在足够高的级别声明它们,以便所有想要使用它的人都可以看到它,可见性。
通过在main函数内部定义类型,只有函数体main可以访问它。在这种情况下,是的,你应该把的结构之外的定义main,因为这两个main和build_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)