String
实现了Deref<Target = str>
,这意味着以下代码可以编译:
fn save(who: &str) {
println!("I'll save you, {}!", who);
}
save(&String::from("Madoka"));
如果我创建一个也实现
Deref<Target = str>
的自定义类型,那么这也有效:
struct Madoka;
impl Deref for Madoka {
type Target = str;
fn deref(&self) -> &Self::Target {
"Madoka"
}
}
save(&Madoka);
现在,让我们尝试强制转换为另一种类型 - 例如,
u32
。似乎也有效:
fn reset(how: &u32) {
println!("Reset {} times", how);
}
struct Homura;
impl Deref for Homura {
type Target = u32;
fn deref(&self) -> &Self::Target {
&42
}
}
reset(&Homura);
但是当我将表达式包装在块中时,它不再编译:
reset(&{ Homura });
error[E0308]: mismatched types
--> src/main.rs:17:14
|
17 | reset(&{ Homura });
| ^^^^^^ expected u32, found struct `main::Homura`
|
= note: expected type `u32`
found type `main::Homura`
奇怪的是,与
&str
等效的表达式编译得很好:
save(&{ Madoka }); // OK
为什么第一个表达式编译失败,而第二个表达式却编译成功?
已经在评论中回答:这是一个错误。