Rust会自动解引用原始类型的引用吗?

12

我是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);

}

能有人解释一下这个功能吗?

1个回答

9
在Rust中,所有的算术运算符均可用于基本类型和对应类型的引用。例如,可以查看 std::ops::Mul 中的Implementors部分,该Trait控制了*运算符的重载。
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

等等等等。

在你的例子中,b1 的类型为 &Box<i32>(默认整数类型),虽然 Box 实现了许多特性作为其包含类型的传递(例如 impl<T: Read> Read for Box<T>),但算术运算符不在其中。这就是为什么你必须解引用盒子的原因。


是的,不受限制的整数字面量默认为 i32 - Steve Klabnik

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