如何解决在比赛中使用ref和与非引用匹配之间有区别吗?
这两个match
分支是否等效?
struct Quux { wibble: u8 }
enum Foo {
Bar(Quux),Baz(Quux),}
impl Foo {
pub fn quux(&self) -> &Quux {
match self {
Foo::Bar(ref quux) => quux,Foo::Baz(quux) => &quux,}
}
}
如果是,为什么ref
存在?
解决方法
当我们匹配值而不是引用时,它们确实有所不同。考虑示例:
enum Foo {
Bar(i32),Baz(i32),}
fn main() {
// bar is a value.
let bar = Foo::Baz(13);
// Uncomment line below to make bar become a reference.
//let bar = &bar;
let i = match bar {
Foo::Bar(ref x) => x,Foo::Baz(x) => &x,};
println!("{}",i);
}
编译出现错误
error[E0597]: `x` does not live long enough
--> src/main.rs:15:24
|
13 | let i = match bar {
| - borrow later stored here
14 | Foo::Bar(ref x) => x,15 | Foo::Baz(x) => &x,| ^-
| ||
| |`x` dropped here while still borrowed
| borrowed value does not live long enough
x
分支中的Foo::Baz(x)
拥有i32
内部Baz
的所有权,并被丢弃在分支的末端。这就是i
不能借用x
,寿命不足的原因。另一方面,x
分支中的Foo::Bar(ref x)
没问题,因为它只是借用i32
内部的Bar
。
但是,如果我们取消注释let bar = &bar;
行,则bar
将成为引用,并且ref
将自动插入到每个分支中(根据rust reference)。这样就可以编译。
在您的代码中,由于quux
借用了self
(quux(&self)
)而不是拥有所有权(quux(self)
),这意味着{{ 1}}是参考,因此可以编译。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。