gpt4 book ai didi

rust - Rust 中 struct impl 的匹配表达式中 *self 的所有权是什么

转载 作者:行者123 更新时间:2023-11-29 07:59:37 26 4
gpt4 key购买 nike

我正在使用 here 中的示例

#[derive(Debug)]
enum List {
Cons(i32, RefCell<Rc<List>>),
Nil,
}

impl List {
fn tail(&self) -> Option<&RefCell<Rc<List>>> {
match *self {
Cons(_, ref item) => Some(item),
Nil => None,
}
}
}

鉴于函数签名是 &selfself 是指向 List 的引用类型,而 *selfList 实例本身。

但我记得 match 也拥有它所匹配的对象的所有权,所以这不会对结构造成问题,因为 List 实例被移动到 匹配而不回馈?

而且 &self 不是不可变的,为什么我们可以将 self 移动到 match

最佳答案

match 自身 不会移动任何东西。移动、复制或借用发生在 match 的分支中。示例:

let s = "test".to_string();
let a = s; // this is a move
// println!("{}", s); // ... so this is a "use after move" compilation error

但如果我们这样做:

match a { // this is allowed, a does not move anywhere
// but in the branch...
// this is an error: it would move a to res
// res if res == "test".to_string() => "ok",
// ^^^ moves value into pattern guard
ref res if res == "test" => "ok", // with ref it's fine (we're
// taking a by reference)
_ => "ko",
}

playground

请注意,您可能确实会在 match 中遇到所有权问题,但它们通常是由于您在 match 关键字之后执行的操作所致。

例如这失败了:

// let's break the string in two pieces
match a.split_off(2)
// ^ cannot borrow mutably

但这是因为 split_off 采用了 &mut self,而不是结果上的 match

关于rust - Rust 中 struct impl 的匹配表达式中 *self 的所有权是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47467936/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com