我对Rust 还不熟悉,我正在努力学习参考资料是如何工作的.在下面的代码中,当我想计算a1,也就是i32时,我不需要go 引用它.但对于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中的所有算术运算符都是为基元值和对运算符两侧基元的引用实现的.例如,请参见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的类型为&Box<i32>(默认的整数类型),而Box实现了许多trait作为其包含类型的传递(例如impl<T: Read> Read for Box<T>),算术运算符不在其中.这就是为什么你必须取消对方框的引用.

Rust相关问答推荐

铁 rust 干线无法使用PowerShell获取环境变量

限制未使用的泛型导致编译错误

你是如何在铁 rust 一侧的金牛座获得应用程序版本的?

可以为rust构建脚本编写单元测试吗?

如何在函数中返回自定义字符串引用?

完全匹配包含大小写的整数范围(&Q;)

为什么 js_sys Promise::new 需要 FnMut?

Rust 中指向自身的引用如何工作?

‘&T as *const T as *mut T’ 在 ‘static mut’ 项目中合适吗?

全面的 Rust Ch.16.2 - 使用捕获和 const 表达式的 struct 模式匹配

如何使用 Rust Governor 为每 10 秒 10 个请求创建一个 RateLimiter?

std::vector::shrink_to_fit 如何在 Rust 中工作?

是否可以在 Rust 中的特定字符上实现特征?

仅在运行测试时生成调试输出

Rust 异步和 AsRef 未被发送

预期的整数,找到 `&{integer}`

如何使用 rust bindgen 生成的 std_vector

为什么 match 语句对引用类型比函数参数更挑剔?

我可以在不调用 .clone() 的情况下在类型转换期间重用 struct 字段吗?

Iterator::collect如何进行转换?