syntax - 当表达式被包装在一个块中时,为什么这种 deref 强制会失败?
问题描述
String
implements 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
为什么第一个表达式编译失败,而第二个编译成功?
解决方案
推荐阅读
- npm - npm/yarn/package.json 世界中惯用的“清理”任务
- php - 如何对 ActiveDirectory 服务器的身份验证进行故障排除
- lua - 如何将多个模型附加到 Garry's Mod 中的实体?
- apache-spark - Azure Synapse:Spark 作业定义中指定的目标 Spark 池未处于成功状态。当前状态:供应
- python - 需要在 Selenium 中使用 Python 机器人框架默认禁用相同的站点
- python - 下载 tgz 文件到 colab
- typescript - 如何将 react-query useMutation 与多部分文件上传一起使用?
- r - 密度图,但作为 y 轴发生的某事的百分比
- visual-studio-2019 - 无法在 Visual Studio 2019 上添加连接
- c# - C# 中的 Cognito 触发器