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
之间的区别,那么请问一个新问题(我认为它甚至有很好的机会成为规范)。如果您不同意编辑,请将其回滚并重新格式化,以便您的问题与您的代码和错误消息有关。