【问题标题】:Does Rust automatically dereference primitive type references?Rust 会自动解引用原始类型引用吗?
【发布时间】:2015-03-24 21:58:38
【问题描述】:

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

}

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

【问题讨论】:

    标签: rust


    【解决方案1】:

    Rust 中的所有算术运算符都是针对原始值和对运算符两侧的原始值的引用而实现的。例如,请参阅 std::ops::MulImplementors 部分,控制覆盖 * 运算符的特征。

    你会看到类似的东西:

    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 的类型为 &amp;Box&lt;i32&gt;(默认整数类型),虽然 Box 实现了许多特征作为其包含类型(例如 impl&lt;T: Read&gt; Read for Box&lt;T&gt;)的直通,但算术运算符不在其中.这就是为什么您必须取消引用该框。

    【讨论】:

    • 是的,不受约束的整数文字默认为 i32
    猜你喜欢
    • 2023-03-04
    • 1970-01-01
    • 2017-03-05
    • 2015-02-05
    • 1970-01-01
    • 1970-01-01
    • 2021-02-13
    • 2010-12-11
    相关资源
    最近更新 更多