gpt4 book ai didi

reference - 对于 `&b` 中的 `&A`,如何将引用 `b: B` 强制转换为 `let a: &A = &b;`?

转载 作者:行者123 更新时间:2023-11-29 08:05:53 24 4
gpt4 key购买 nike

我有以下结构:

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 的意思特质是为了。

关于reference - 对于 `&b` 中的 `&A`,如何将引用 `b: B` 强制转换为 `let a: &A = &b;`?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54466319/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com