在Rust模式匹配中,ref和&有什么区别?

5
做这个练习时https://github.com/rust-lang/rustlings/blob/main/exercises/option/option3.rs,我发现了ref关键字,并且我很困惑在模式匹配中何时应该使用&ref。在这个例子中,每个匹配都输出相同的消息,但我无法确定它们之间的区别:
struct Point { x: i32, y: i32}

fn main() {
    let y: Option<Point> = Some(Point { x: 100, y: 200 });

    match &y {
        Some(p) => println!("Co-ordinates are {},{} ", p.x, p.y),
        _ => println!("no match"),
    }

    match y {
        Some(ref p) => println!("Co-ordinates are {},{} ", p.x, p.y),
        _ => println!("no match"),
    }

    match &y {
        Some(ref p) => println!("Co-ordinates are {},{} ", p.x, p.y),
        _ => println!("no match"),
    }

    y;
}
1个回答

4

ref是比较老的写法。匹配一个引用并返回一个引用是由match ergonomics特性导致的结果。

它们不完全相同,但通常可以选择。我和许多其他人喜欢&的形式,尽管我看到有些人不喜欢match ergonomics并始终更喜欢显式的ref

有些情况下你无法获取一个引用,这时你被迫使用ref。我也更喜欢在像Option::as_ref()Option::as_mut()这样的情况下使用ref,因为使用match ergonomics它们将具有完全相同的代码,这在我的意见中很令人困惑,而使用ref一个只是ref,另一个使用ref mut


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接