首页 > 解决方案 > 当表达式被包装在一个块中时,为什么这种 deref 强制会失败?

问题描述

Stringimplements 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

为什么第一个表达式编译失败,而第二个编译成功?

操场

标签: syntaxrustcoercion

解决方案


推荐阅读