Rust的ref关键字是否可以避免?

Joe*_*ley 2 language-design pattern-matching rust

为什么Rust有ref关键字?可以

match value.try_thing() {
    &Some(ref e) => do_stuff(e),
    // ...
}
Run Code Online (Sandbox Code Playgroud)

不能由

match value.try_thing() {
    &Some(e) => do_stuff(&e),
    // ...
}
Run Code Online (Sandbox Code Playgroud)

She*_*ter 6

不,您建议的语法无法避免。您的语法不允许引用,否则将允许移动。在此示例中,inner是的整数副本,对其进行val更改不会影响val

fn main() {
    let mut val = Some(42);

    if let &mut Some(mut inner) = &mut val {
        inner += 1;
    }

    println!("{:?}", val); // Some(42)
}
Run Code Online (Sandbox Code Playgroud)

ref需要使用关键字来强制引用:

fn main() {
    let mut val = Some(42);

    if let &mut Some(ref mut inner) = &mut val {
        *inner += 1;
    }

    println!("{:?}", val); // Some(43)
}
Run Code Online (Sandbox Code Playgroud)

Match人机工程学允许以更简单的方式编写代码:

fn main() {
    let mut val = Some(42);

    if let Some(inner) = &mut val {
        *inner += 1;
    }

    println!("{:?}", val);
}
Run Code Online (Sandbox Code Playgroud)

但是,如果仅从这种语法开始,那么我们可能会遇到相反的问题和关键字,一个是强制移动。也许吧Some(move inner)。在该替代宇宙中,会有一个问题询问move关键字是否可以避免。

也可以看看:


归档时间:

查看次数:

120 次

最近记录:

6 年,3 月 前