Rust从入门到实战系列四十七:使用字段初始化简写语法

因为示例 5-4 中的参数名与字段名都完全相同,我们可以使用 字段初始化简写语法(field init shorthand)来重写 build_user,这样其行为与之前完全相同,不过无需重复 email 和 username 了。

# active: bool,
# username: String,
# email: String,
# sign_in_count: u64,
# }
#
fn build_user(email: String, username: String) -> User {
User {
email,
username,
active: true,
sign_in_count: 1,
}
}
#
# fn main() {
# let user1 = build_user(
# String::from("someone@example.com"),
# String::from("someusername123"),
# );
# }

这里我们创建了一个新的 User 结构体实例,它有一个叫做 email 的字段。我们想要将 email 字段的值设置为 build_user 函数 email 参数的值。因为 email 字段与 email 参数有着相同的名称,则只需编写email 而不是 email: email。
使用结构体更新语法从其他实例创建实例使用旧实例的大部分值但改变其部分值来创建一个新的结构体实例通常是很有用的。这可以通过 结构体更新语法(struct update syntax)实现。
首先,示例 5-6 展示了不使用更新语法时,如何在 user2 中创建一个新 User 实例。我们为 email 设置了新的值,其他值则使用了实例 5-2 中创建的 user1 中的同名值:

# active: bool,
# username: String,
# email: String,
# sign_in_count: u64,
# }
#
fn main() {
// --snip--
#
# let user1 = User {
# email: String::from("someone@example.com"),
# username: String::from("someusername123"),
# active: true,
# sign_in_count: 1,
# };
let user2 = User {
active: user1.active,
username: user1.username,
email: String::from("another@example.com"),
sign_in_count: user1.sign_in_count,
};
}

使用结构体更新语法,我们可以通过更少的代码来达到相同的效果,如示例 5-7 所示。 … 语法指定了剩余未显式设置值的字段应有与给定实例对应字段相同的值。

# active: bool,
# username: String,
# email: String,
# sign_in_count: u64,
# }
#
fn main() {
// --snip--
#
# let user1 = User {
# email: String::from("someone@example.com"),
# username: String::from("someusername123"),
# active: true,
# sign_in_count: 1,
# };
let user2 = User {
email: String::from("another@example.com"),
..user1
};
}

请注意,结构更新语法就像带有 = 的赋值,因为它移动了数据,就像我们在” 变量与数据交互的方式(一):移动” 部分讲到的一样。在这个例子中,我们在创建 user2 后不能再使用 user1,因为 user1 的username 字段中的 String 被移到 user2 中。如果我们给 user2 的 email 和 username 都赋予新的String 值,从而只使用 user1 的 active 和 sign_in_count 值,那么 user1 在创建 user2 后仍然有效。
active 和 sign_in_count 的类型是实现 Copy trait 的类型,所以我们在” 变量与数据交互的方式(二):克隆” 部分讨论的行为同样适用。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值