我很难理解何时使用星号运算符进行解除引用以及何时可以省略它.
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
}
Run Code Online (Sandbox Code Playgroud)
上面的代码示例几乎编译,除了我在可变引用中添加一个的最后一个语句x.我收到此错误:
the trait bound `_: std::ops::Add<&mut _>` is not satisfied [E0277]
Run Code Online (Sandbox Code Playgroud)
其他任何地方星号和非星号都是有效的,并给出预期的结果.
小智 5
您只能通过实现Addtrait来添加定义了运算符的类型。在您执行的两个示例中1 + *x,类型*xisi32并且确实i32 + i32已定义。为方便起见,还有一个i32 + &i32(and&i32 + i32和&i32 + &i32) 的实现可以b工作,但这只是针对一个不可变引用的特定情况,它不会扩展到,比如说&&i32or &mut i32。这就是为什么d不起作用。
| 归档时间: |
|
| 查看次数: |
590 次 |
| 最近记录: |