Rust会自动取消引用原始类型引用吗?

Cha*_*enu 10 rust

我是Rust的新手,并试图了解引用的工作原理.在下面的代码中,当我想要进行计算时a1,i32我不必取消引用它.但随着b1这是一个Box,我必须取消对它的引用.

实际上,这两个let a2 = a1 * 2;let a3 = *a1 * 2;的行为类似.看起来像原语中的解引用是可选的,或者编译器隐式地为我们做这件事.

fn main(){
    let a = 5;
    let b = Box::new(10);
    let a1 = &a;
    let b1 = &b;

    println!("{} {}", a1, b1);

    let a2 = a1 * 2;
    let b2 = (**b1) * 10;
    let a3 = *a1 * 2;

    println!("{} {} {}", a2, a3, b2);

}
Run Code Online (Sandbox Code Playgroud)

有人可以解释这个功能吗?

Aus*_*n B 6

Rust中的所有算术运算符都是为原始值和对运算符两侧的基元的引用实现的.例如,请参阅控制操作符覆盖的特征Implementors部分.std::ops::Mul*

你会看到类似的东西:

impl Mul<i32> for i32
impl<'a> Mul<i32> for &'a i32
impl<'a> Mul<&'a i32> for i32
impl<'a, 'b> Mul<&'a i32> for &'b i32
Run Code Online (Sandbox Code Playgroud)

等等等等.

在您的示例中,b1有一个类型&Box<i32>(默认的整数类型),并且虽然Box实现了许多特性作为其包含类型的直通(例如impl<T: Read> Read for Box<T>),但算术运算符不在其中.这就是你必须取消引用该框的原因.