如何在 let a: &A = &b; 中将引用 `&b` 强制转换为 `&A` for `b: B`?

How to coerce reference `&b` into `&A` for `b: B` in `let a: &A = &b;`?

我有以下结构:

struct Age(u8);
struct User {
    age: Age,
}

我想将 User 类型的借用值强制转换为 &Age,如以下示例所示:

let s = String::from("abcd");
let z: &str = &s; // This works

let b = Box::new(Age(8));
let a: &Age = &b; // This also works

documentation for Borrow 提到类型 A 可以作为其他类型 B 借用,如果 A 实现 Borrow<B>,所以我尝试实现 Borrow<Age> 对于 User:

use std::borrow::Borrow;

impl Borrow<Age> for User {
    fn borrow(&self) -> &Age {
        &self.age
    }
}

fn main() {
    let u = User { age: Age(8) };
    let a: &Age = u.borrow();     // Works
    let a: &Age = &u;             // Error
}

这是我收到的错误消息:

error[E0308]: mismatched types
  --> src/main.rs:23:19
   |
23 |     let a: &Age = &u; // Error: expected struct `Age`, found struct `User`
   |                   ^^ expected struct `example::Age`, found struct `example::User`
   |
   = note: expected type `&example::Age`
              found type `&example::User`

我错过了什么吗?我如何将 &u 强制转换为 &Age

BoxString 的两个例子不是因为 Borrow 特性,而是因为 Deref 特性。您示例中的框 &b 可以强制转换为 &Age,因为 Box<Age> 实现了 Deref<Target = Age>。类似地,String 有一个 Deref 实现,因此可以将字符串引用 &s 强制转换为 &str。它会以完全相同的方式为您的 User 工作:

use std::ops::Deref;

impl Deref for User { // That's bad, don't do that.
    type Target = Age;
    fn deref(&self) -> &Age {
        &self.age
    }
}

在此范围内,现在可以编译以下内容:

let u = User { age: Age(8) };
let a: &Age = &u;

请注意,该示例有些人为而非惯用:没有人会期望 User 表现得像指向 Age 的指针类型。同样,没有人会期望 user.borrow() 借用 Age 而不是 User,这不是 Borrow 特征的目的。