Reference 如何强制引用`&;b`into`&;A`代表b:b`in`让A:&;A=&;b、 ”“是吗?

Reference 如何强制引用`&;b`into`&;A`代表b:b`in`让A:&;A=&;b、 ”“是吗?,reference,rust,borrow-checker,coercion,Reference,Rust,Borrow Checker,Coercion,我有以下结构: 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 提到如果A实现了借用,那么类型A可以像其他

我有以下结构:

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
提到如果
A
实现了
借用
,那么类型
A
可以像其他类型
B
一样借用,因此我尝试为
用户
实现
借用

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
}

我错过什么了吗?我如何强制
&u
进入
&Age

带有
框和
字符串的两个示例之所以有效,不是因为
借用
特性,而是因为
删除
特性。示例中的框
&b
可以强制为
&Age
,因为
box
实现了
Deref
。类似地,
String
有一个
Deref
实现,因此可以将字符串引用
&s
强制为
&str
。它将以完全相同的方式为您的
用户
工作:

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
特性的目的。

这个问题将两个不相关的事情混为一谈。您的代码基本上与您的问题无关-它是否有效取决于
Deref
trait,而不是
Borrow
trait。如果你想修改代码,你应该相应地改写问题。如果您想知道
AsRef
Borrow
之间的区别,那么您的代码基本上是不相关的(这方面可能已经有重复的问题了)。另请参见:在文档中。我重新制定了问题,以便它将重点放在实际错误上,而不是推测
Borrow
AsRef
之间的差异(这两个特征与此错误消息无关)。如果你想知道
Borrow
AsRef
之间的区别,那么请问一个新问题(我认为它甚至有很好的机会成为规范)。如果您不同意编辑,请将其回滚并重新格式化,以便您的问题与您的代码和错误消息有关。