我什么时候可以省略使用星号运算符解除引用?

时间:2016-07-02 18:06:16

标签: rust

我很难理解何时使用星号运算符进行解除引用以及何时可以省略它。

fn main() { a(); b(); c(); d(); }

fn a() {
    let v = 1;
    let x = &v;
    println!("a {}", *x);
    println!("a {}", 1 + *x);
}

fn b() {
    let v = 1;
    let x = &v;
    println!("b {}", x);
    println!("b {}", 1 + x);
}

fn c() {
    let mut v = 1;
    let mut x = &mut v;
    println!("c {}", *x);
    println!("c {}", 1 + *x);
}

fn d() {
    let mut v = 1;
    let mut x = &mut v;
    println!("d {}", x);
    println!("d {}", 1 + x); // error
}

上面的代码示例几乎编译,除了我在可变引用x中添加一个的最后一个语句。在那里我收到了这个错误:

the trait bound `_: std::ops::Add<&mut _>` is not satisfied [E0277]

其他任何地方,星号和非星号版本都有效,并给出预期的结果。

1 个答案:

答案 0 :(得分:4)

您只能通过实施Add特征来添加定义了运算符的类型。在您执行1 + *x的两个示例中,*x的类型为i32,确实i32 + i32已定义。为方便起见,还有一个i32 + &i32(以及&i32 + i32&i32 + &i32)的实现,它使b正常工作,但这对于特定的只是一个不可变引用的情况,它不会延伸到&&i32&mut i32。这就是d不起作用的原因。