我是Rust的新手,正在努力理解Reference是如何工作的.下面是一个简单的函数.

fn f1(x: &i32) -> &i32{
    x
}

因为x&i32类型,所以返回它直接与返回类型&i32匹配.但我发现,如果我将函数更改为以下内容,它也可以毫无问题地进行编译:

fn f1(x: &i32) -> &i32{
    &x
}

这里x是类型&i32,&x是类型&&i32,与返回类型&i32不匹配.它为什么会编译?

推荐答案

这是type coercion的结果.

为了使语言更符合人体工程学,在特定情况下允许使用certain set of coercions.其中一种情况是确定函数的返回值.

在允许的强制措施中,有以下几种:

&;T或&;mut T到&;U,如果T实现了Deref<;Target=U>;

在本例中,STD文库中有一个implementation of the deref的特征:

impl<T: ?Sized> const Deref for &T {
    type Target = T;

    #[rustc_diagnostic_item = "noop_method_deref"]
    fn deref(&self) -> &T {
        *self
    }
}

在您的例子中,目标Ti32,特征是为&T实现的(即.&&i32),因此可以将该值从&&i32强制为&i32.

Rust相关问答推荐

什么是谓词的简短和简洁类型

rust 蚀将动力特性浇到混凝土 struct 上是行不通的

在一个tauri协议处理程序中调用一个rectuc函数的推荐技术是什么?

如何高效地将 struct 向量中的字段收集到单独的数组中

在生存期内将非静态可变引用转换为范围内的静态可变引用

Rust中WPARAM和VIRTUAL_KEY的比较

为什么RefCell没有与常规引用相同的作用域?

为相同特征的特征对象使用 move 方法实现特征

如何从宏调用闭包?

当没有实际结果时,如何在 Rust 中强制执行错误处理?

面临意外的未对齐指针取消引用:地址必须是 0x8 的倍数,但为 0x__错误

Rust 打包在 .deb 中

Rust 中的生命周期:borrow 的 mut 数据

为什么数组不像向量那样在 for 块之后移动?

在 FFI 的上下文中,未初始化是什么意思?

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

有没有办法阻止 rust-analyzer 使非活动代码变暗?

如果返回类型是通用的,我可以返回 &str 输入的一部分吗?

为什么 `ref` 会导致此示例*取消引用*一个字段?

为什么在使用 self 时会消耗 struct 而在解构时不会?