作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有以下结构:
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/
我是一名优秀的程序员,十分优秀!