如何在 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
?
Box
和 String
的两个例子不是因为 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
特征的目的。
我有以下结构:
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
?
Box
和 String
的两个例子不是因为 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
特征的目的。